par exemple, pour 1, 2, 128, 256
, la sortie peut être (16 chiffres):
0000000000000001
0000000000000010
0000000010000000
0000000100000000
J'ai essayé
String.format("%16s", Integer.toBinaryString(1));
il met des espaces pour left-padding:
` 1'
Comment mettre 0
s pour le remplissage. Je ne pouvais pas le trouver dans Formatter . Y a-t-il une autre façon de le faire?
Merci d'avance.
P.S. cet article décrit comment formater des entiers avec un remplissage à gauche, mais ce n'est pas le cas pour la représentation binaire.
Je pense que c'est une solution sous-optimale, mais vous pourriez le faire
String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')
Il n'y a pas de conversion binaire intégrée dans Java.util.Formatter. Je vous conseillerais soit d'utiliser String.replace pour remplacer le caractère d'espace par des zéros, comme dans:
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")
Ou implémentez votre propre logique pour convertir les entiers en représentation binaire avec un bourrage à gauche ajouté quelque part dans les lignes données dans this so . Ou si vous avez vraiment besoin de passer des nombres au format, vous pouvez convertir votre représentation binaire en BigInteger. puis formatez-le avec des zéros non significatifs, mais cela coûte très cher à l'exécution, comme dans:
String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
Vous pouvez utiliser Apache Commons StringUtils . Il propose des méthodes pour le rembourrage des chaînes:
StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
J'essayais toutes sortes d'appels de méthode que je n'avais pas vraiment utilisés auparavant pour réussir ce travail. Ils ont fonctionné avec un succès modéré, jusqu'à ce que je pense à quelque chose d'aussi simple que ça pourrait marcher, et ça a fonctionné!
Je suis sûr que cela a déjà été pensé, je ne suis pas sûr que ce soit utile pour une longue chaîne de codes binaires, mais cela fonctionne très bien pour les chaînes 16 bits. J'espère que ça aide!! (Notez que le deuxième morceau de code est amélioré)
String binString = Integer.toBinaryString(256);
while (binString.length() < 16) { //pad with 16 0's
binString = "0" + binString;
}
Merci à Will d’avoir aidé à améliorer cette réponse pour qu’elle fonctionne avec une boucle ..__ Ceci est peut-être un peu maladroit, mais ça marche, merci de l’améliorer et de commenter si vous le pouvez ....
binString = Integer.toBinaryString(256);
int length = 16 - binString.length();
char[] padArray = new char[length];
Arrays.fill(padArray, '0');
String padString = new String(padArray);
binString = padString + binString;
Voici une nouvelle réponse pour un ancien post.
Pour compléter une valeur binaire avec des zéros non significatifs à une longueur spécifique, essayez ceci:
Integer.toBinaryString( (1 << len) | val ).substring( 1 )
Si len = 4
et val = 1
,
Integer.toBinaryString( (1 << len) | val )
renvoie la chaîne "10001"
, puis
"10001".substring( 1 )
élimine le tout premier caractère. Nous obtenons donc ce que nous voulons:
"0001"
Si val
est susceptible d'être négatif, essayez plutôt:
Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )
essayer...
String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));
Je ne pense pas que ce soit la "bonne" façon de faire cela ... mais ça marche :)
Je ne connais pas la "bonne" solution mais je peux vous proposer un correctif rapide.
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");
Je viens de l'essayer et j'ai vu que cela fonctionnait bien.
Une version plus simple de l'idée de user3608934 "C'est un vieux tour, créez une chaîne avec 16 0 puis ajoutez la chaîne binaire que vous avez obtenue":
private String toBinaryString32(int i) {
String binaryWithOutLeading0 = Integer.toBinaryString(i);
return "00000000000000000000000000000000"
.substring(binaryWithOutLeading0.length())
+ binaryWithOutLeading0;
}
Une solution naïve qui fonctionnerait
String temp = Integer.toBinaryString(5);
while (temp.length() < Integer.SIZE) temp = "0"+temp; //pad leading zeros
temp = temp.substring(Integer.SIZE - Short.SIZE); //remove excess
Une autre méthode serait
String temp = Integer.toBinaryString((m | 0x80000000));
temp = temp.substring(Integer.SIZE - Short.SIZE);
Cela produira une chaîne de 16 bits de l'entier 5
Cette méthode convertit un int en une chaîne, longueur = bits. Rembourré avec 0 ou avec les bits les plus significatifs tronqués.
static String toBitString( int x, int bits ){
String bitString = Integer.toBinaryString(x);
int size = bitString.length();
StringBuilder sb = new StringBuilder( bits );
if( bits > size ){
for( int i=0; i<bits-size; i++ )
sb.append('0');
sb.append( bitString );
}else
sb = sb.append( bitString.substring(size-bits, size) );
return sb.toString();
}
import Java.util.Scanner;
public class Q3{
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
System.out.println("Enter a number:");
int num=scn.nextInt();
int numB=Integer.parseInt(Integer.toBinaryString(num));
String strB=String.format("%08d",numB);//makes a 8 character code
if(num>=1 && num<=255){
System.out.println(strB);
}else{
System.out.println("Number should be in range between 1 and 255");
}
}
}
Vous pouvez utiliser lib https://github.com/kssource/BitSequence . Il accepte un nombre et retourne par chaîne simple, complété et/ou groupé.
String s = new BitSequence(2, 16).toBynaryString(ALIGN.RIGHT, GROUP.CONTINOUSLY));
return
0000000000000010
another examples:
[10, -20, 30]->00001010 11101100 00011110
i=-10->00000000000000000000000000001010
bi=10->1010
sh=10->00 0000 0000 1010
l=10->00000001 010
by=-10->1010
i=-10->bc->11111111 11111111 11111111 11110110
// Ci-dessous traitera les tailles appropriées
public static String binaryString(int i) {
return String.format("%" + Integer.SIZE + "s", Integer.toBinaryString(i)).replace(' ', '0');
}
public static String binaryString(long i) {
return String.format("%" + Long.SIZE + "s", Long.toBinaryString(i)).replace(' ', '0');
}
for(int i=0;i<n;i++)
{
for(int j=str[i].length();j<4;j++)
str[i]="0".concat(str[i]);
}
str[i].length()
est la longueur du nombre disons 2 en binaire est 01 ce qui est la longueur 2 change 4 en longueur maximale désirée du nombre. Ceci peut être optimisé à O (n) ..__ en utilisant continue.
Je voudrais écrire ma propre classe util avec la méthode comme ci-dessous
public class NumberFormatUtils {
public static String longToBinString(long val) {
char[] buffer = new char[64];
Arrays.fill(buffer, '0');
for (int i = 0; i < 64; ++i) {
long mask = 1L << i;
if ((val & mask) == mask) {
buffer[63 - i] = '1';
}
}
return new String(buffer);
}
public static void main(String... args) {
long value = 0b0000000000000000000000000000000000000000000000000000000000000101L;
System.out.println(value);
System.out.println(Long.toBinaryString(value));
System.out.println(NumberFormatUtils.longToBinString(value));
}
}
Sortie:
5 101 000000000000000000000000000000000000000000000000000000000010101
La même approche pourrait être appliquée à n'importe quel type d'intégrale. Faites attention au type de masque
long mask = 1L << i;
Ceci est un vieux truc, créez une chaîne avec 16 0, puis ajoutez la chaîne binaire découpée obtenue de String.format ("% s", Integer.toBinaryString (1)) et utilisez les 16 caractères les plus à droite, en supprimant les 0's. Mieux encore, créez une fonction qui vous permet de spécifier la longueur d’une chaîne binaire souhaitée. Bien sûr, il existe probablement mille autres moyens d'y parvenir, y compris les bibliothèques, mais j'ajoute ce post pour aider un ami :)
public class BinaryPrinter {
public static void main(String[] args) {
System.out.format("%d in binary is %s\n", 1, binaryString(1, 4));
System.out.format("%d in binary is %s\n", 128, binaryString(128, 8));
System.out.format("%d in binary is %s\n", 256, binaryString(256, 16));
}
public static String binaryString( final int number, final int binaryDigits ) {
final String pattern = String.format( "%%0%dd", binaryDigits );
final String padding = String.format( pattern, 0 );
final String response = String.format( "%s%s", padding, Integer.toBinaryString(number) );
System.out.format( "\npattern = '%s'\npadding = '%s'\nresponse = '%s'\n\n", pattern, padding, response );
return response.substring( response.length() - binaryDigits );
}
}