(Java) ¿Especifique el número de bits (longitud) al convertir un número binario en una cadena?

StackOverflow https://stackoverflow.com/questions/625838

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de almacenar un número como una cadena binaria en una matriz pero necesito especificar cuántos bits para almacenarlo.

Por ejemplo, si necesito almacenar 0 con dos bits, necesito una cadena " 00 " ;. O 1010 con 6 bits, por lo que " 001010 " ;.

¿Alguien puede ayudar?

EDITAR: Gracias chicos, ya que soy una basura en matemáticas / programación en general, he optado por la solución más simple que fue la de David. Algo como:

binaryString.append(Integer.toBinaryString(binaryNumber));
for(int n=binaryString.length(); n<numberOfBits; n++) {
                        binaryString.insert(0, "0");
}

Parece que funciona bien, así que a menos que sea muy ineficiente, lo haré.

¿Fue útil?

Solución

Use Integer.toBinaryString () luego verifique la longitud de la cadena y prepárela con tantos ceros como sea necesario para hacer la longitud deseada.

Otros consejos

Olvídate de las soluciones caseras. Utilice el estándar BigInteger en su lugar. Puede especificar el número de bits y luego usar el método toString (int radix) para recuperar lo que necesita (supongo que necesita radix = 2).

EDITAR: dejaría el control de bits a BigInteger. El objeto redimensionará internamente su búfer de bits para ajustarse a la nueva dimensión numérica. Además, mediante este objeto se pueden realizar operaciones aritméticas (no es necesario implementar sumadores / multiplicadores binarios, etc.). Aquí hay un ejemplo básico:

package test;

import java.math.BigInteger;

public class TestBigInteger
{
    public static void main(String[] args)
    {
        String value = "1010";
        BigInteger bi = new BigInteger(value,2);
        // Arithmetic operations
        System.out.println("Output: " + bi.toString(2));
        bi = bi.add(bi); // 10 + 10
        System.out.println("Output: " + bi.toString(2));
        bi = bi.multiply(bi); // 20 * 20
        System.out.println("Output: " + bi.toString(2));

        /*
         * Padded to the next event number of bits
         */
        System.out.println("Padded Output: " + pad(bi.toString(2), bi.bitLength() + bi.bitLength() % 2));
    }

    static String pad(String s, int numDigits)
    {
        StringBuffer sb = new StringBuffer(s);
        int numZeros = numDigits - s.length();
        while(numZeros-- > 0) { 
            sb.insert(0, "0");
        }
        return sb.toString();
    }
}

Este es un problema de tarea común. Hay un circuito genial que puedes escribir que calculará la potencia más pequeña de 2 > = tu número objetivo n .

Como es una potencia de 2, el logaritmo de base 2 es el número de bits. Pero la biblioteca de Java math solo ofrece logaritmo natural.

math.log( n ) / math.log(2.0) 

es el número de bits.

Aún más simple:

String binAddr = Integer.toBinaryString(Integer.parseInt(hexAddr, 16));  
String.format("%032", new BigInteger(binAddr)); 

La idea aquí es analizar la cadena nuevamente como un número decimal temporalmente (uno que por casualidad consiste en todos los 1 y 0) y luego usar String.format ().

Tenga en cuenta que básicamente tiene que usar BigInteger, porque las cadenas binarias se desbordan rápidamente Integer y Long, lo que da como resultado NumberFormatExceptions si intenta usar Integer.fromString () o Long.fromString () .

Prueba esto:

String binaryString = String.format("%"+Integer.toString(size)+"s",Integer.toBinaryString(19)).replace(" ","0");

donde el tamaño puede ser cualquier número que el usuario quiera

Aquí hay una solución simple para los valores de int ; debería ser obvio cómo extenderlo a, por ejemplo, byte, etc.

public static String bitString(int i, int len) {
    len = Math.min(32, Math.max(len, 1));
    char[] cs = new char[len];
    for (int j = len - 1, b = 1; 0 <= j; --j, b <<= 1) {
        cs[j] = ((i & b) == 0) ? '0' : '1';
    }
    return new String(cs);
}

Aquí está la salida de un conjunto de casos de prueba de muestra:

  0   1                                0                                0
  0  -1                                0                                0
  0  40 00000000000000000000000000000000 00000000000000000000000000000000
 13   1                                1                                1
 13   2                               01                               01
 13   3                              101                              101
 13   4                             1101                             1101
 13   5                            01101                            01101
-13   1                                1                                1
-13   2                               11                               11
-13   3                              011                              011
-13   4                             0011                             0011
-13   5                            10011                            10011
-13  -1                                1                                1
-13  40 11111111111111111111111111110011 11111111111111111111111111110011

Por supuesto, estás por tu cuenta para hacer que el parámetro de longitud sea el adecuado para representar el valor completo.

import java.util.BitSet;

public class StringifyByte {

    public static void main(String[] args) {
        byte myByte = (byte) 0x00;
        int length = 2;
        System.out.println("myByte: 0x" + String.valueOf(myByte));
        System.out.println("bitString: " + stringifyByte(myByte, length));

        myByte = (byte) 0x0a;
        length = 6;
        System.out.println("myByte: 0x" + String.valueOf(myByte));
        System.out.println("bitString: " + stringifyByte(myByte, length));
    }

    public static String stringifyByte(byte b, int len) {
        StringBuffer bitStr = new StringBuffer(len);
        BitSet bits = new BitSet(len);
        for (int i = 0; i < len; i++)
        {
           bits.set (i, (b & 1) == 1);
           if (bits.get(i)) bitStr.append("1"); else bitStr.append("0");
           b >>= 1;
        }
        return reverseIt(bitStr.toString());
    }

    public static String reverseIt(String source) {
        int i, len = source.length();
        StringBuffer dest = new StringBuffer(len);

        for (i = (len - 1); i >= 0; i--)
           dest.append(source.charAt(i));
        return dest.toString();
    }
}

Salida:

myByte: 0x0
bitString: 00
myByte: 0x10
bitString: 001010

Así que aquí, en lugar de 8, puedes escribir la longitud deseada y agregará ceros en consecuencia. Si la longitud del número entero mencionado supera la del número mencionado, no se agregarán ceros

String.format("%08d",1111);

  

Salida: 00001111

String.format("%02d",1111);
  

salida: 1111

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top