programa para operadores número numeros numericas hacer convertir conversor conversion como binarios binario bases java binary string-formatting

para - convertir decimal a binario java netbeans



¿Cómo obtener una representación binaria con 0 rellenos de un entero en Java? (15)

por ejemplo, para 1, 2, 128, 256 la salida puede ser (16 dígitos):

0000000000000001 0000000000000010 0000000010000000 0000000100000000

Lo intenté

String.format("%16s", Integer.toBinaryString(1));

pone espacios para el margen izquierdo:

` 1''

Cómo poner 0 s para el relleno. No pude encontrarlo en Formatter . ¿Hay alguna otra forma de hacerlo?

Gracias por adelantado.

PD: esta publicación describe cómo formatear enteros con 0-relleno izquierdo, pero no es para la representación binaria.


// A continuación se manejarán los tamaños adecuados

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''); }


Aquí una nueva respuesta para una publicación anterior.

Para rellenar un valor binario con ceros a una longitud específica, intente esto:

Integer.toBinaryString( (1 << len) | val ).substring( 1 )

Si len = 4 y val = 1 ,

Integer.toBinaryString( (1 << len) | val )

devuelve la cadena "10001" , luego

"10001".substring( 1 )

descarta el primer personaje. Entonces obtenemos lo que queremos:

"0001"

Si val es probable que sea negativo, mejor intente:

Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )


Creo que esta es una solución subóptima, pero podrías hacer

String.format("%16s", Integer.toBinaryString(1)).replace('' '', ''0'')


Escribiría mi propia clase de utilidades con el método siguiente

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)); }

}

Salida:

5 101 0000000000000000000000000000000000000000000000000000000000000101

El mismo enfoque podría aplicarse a cualquier tipo integral. Presta atención al tipo de máscara

long mask = 1L << i;


Estaba probando todo tipo de llamadas a métodos que no había usado antes para hacer que esto funcione, trabajaron con un éxito moderado, hasta que pensé en algo que es tan simple que podría funcionar, y así fue.

Estoy seguro de que ya se pensó en eso, pero no estoy seguro de si sirve para cadenas largas de códigos binarios, pero funciona bien para cadenas de 16 bits. ¡¡Espero eso ayude!! (Tenga en cuenta que se mejora la segunda parte del código)

String binString = Integer.toBinaryString(256); while (binString.length() < 16) { //pad with 16 0''s binString = "0" + binString; }

Gracias a Will por ayudar a mejorar esta respuesta para que funcione sin problemas. Esto tal vez un poco torpe pero funciona, por favor mejora y comenta si puedes ....

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;


Este es un viejo truco, crea una cadena con 16 0 y luego agrega la cadena binaria recortada que obtuviste de String.format ("% s", Integer.toBinaryString (1)) y utiliza los 16 caracteres de la derecha, cortando cualquier línea principal 0''s. Mejor aún, realice una función que le permita especificar cuánto tiempo desea una cadena binaria. Por supuesto, hay probablemente otras tantas maneras de lograr esto, incluidas las bibliotecas, pero estoy agregando esta publicación para ayudar a un amigo :)

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 ); } }


Este método convierte un int en una cadena, length = bits. O rellenado con 0 o con los bits más significativos truncados.

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(); }


No hay una conversión binaria integrada en java.util.Formatter, le aconsejo que use String.replace para reemplazar el carácter de espacio con ceros, como en:

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")

O implemente su propia lógica para convertir enteros en representación binaria con relleno izquierdo añadido en algún lugar a lo largo de las líneas dadas en this punto. O si realmente necesita pasar números para formatear, puede convertir su representación binaria en BigInteger y luego formatear eso con ceros a la izquierda, pero esto es muy costoso en tiempo de ejecución, como en:

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))


No sé la solución "correcta", pero puedo sugerirle un parche rápido.

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");

Lo acabo de probar y vi que funciona bien.


Puede usar lib https://github.com/kssource/BitSequence . Acepta un número y devuelve una cadena bynary, acolchada y / o agrupada.

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


Puedes usar Apache Commons StringUtils . Ofrece métodos para cadenas de relleno:

StringUtils.leftPad(Integer.toBinaryString(1), 16, ''0'');


Una solución ingenua que funcionaría

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

Otro método sería

String temp = Integer.toBinaryString((m | 0x80000000)); temp = temp.substring(Integer.SIZE - Short.SIZE);

Esto producirá una cadena de 16 bits del entero 5


Una versión más simple de la idea de user3608934 "Este es un viejo truco, crea una cadena con 16 0 y luego agrega la cadena binaria recortada que obtuviste":

private String toBinaryString32(int i) { String binaryWithOutLeading0 = Integer.toBinaryString(i); return "00000000000000000000000000000000" .substring(binaryWithOutLeading0.length()) + binaryWithOutLeading0; }


tratar...

String.format("%016d/n", Integer.parseInt(Integer.toBinaryString(256)));

No creo que esta sea la forma "correcta" de hacer esto ... pero funciona :)


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() es la longitud del número, por ejemplo, 2 en binario es 01, que es la longitud 2, cambia 4 a la longitud máxima deseada de número. Esto se puede optimizar a O (n). usando continuar.