Me estoy encontrando difícil de entender y trabajar con esta representación binaria en java:

Con la ayuda de el usuario Jon Skeet, entendí que la representación binaria debe ser construido de esta manera.

He aquí un ejemplo de código:

public class chack {

public static void main(String[] args) {
    int num2=2;
    int num3=3;
    int num4=4;
    int num1=1;
    int nirbinary = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4;
    System.out.println(nirbinary);
    String nir=  Integer.toBinaryString(nirbinary);
    System.out.println(nir);
    }
}

Par de pregunta:

  1. ¿Cómo llega uno num1 (por ejemplo) a un int, que ya está en este binario
  2. ¿por qué obtengo 16909060 cuando puedo imprimir nirbinary – ¿qué significa?
    ¿Cómo llega uno num1 (por ejemplo) a un int, que ya está en este binario
    representación?

Gracias

Podría ser que el número que se obtiene es 2^24 + 2*2^16 + 3*2^8 + 4?

OriginalEl autor Unknown user | 2011-04-08

7 Comentarios

  1. 11

    16909060 representa el número de 16909060.

    Es (1 * 224) + (2 * 216) + (3 * 28) + 4.

    Para obtener num1 de vuelta, justo a la derecha de cambio el resultado de la misma cantidad en la que fue desplazada y la máscara de los bytes (no siempre es necesario para num1(*), pero para los demás):

    int num1 = nirbinary >> 24 & 0xFF;
    int num2 = nirbinary >> 16 & 0xFF;
    int num3 = nirbinary >> 8 & 0xFF;
    int num4 = nirbinary & 0xFF;

    Nota que nirbinary no es «una representación binaria». O más precisamente: no es más o menos el binario que num1, num2, num3 y num4: internamente todos los números (caracteres y booleanos, …) se almacenan en formato binario.

    (*) tenga en cuenta que si num1 es > 127, entonces usted ya sea necesidad de utilizar >>> hacer el derecho de cambio de o utilizar el & 0xFF con el fin de garantizar que el valor correcto es restaurado. La diferencia entre >> y >>> son las «nuevas» bits insertados en el lado «izquierdo» de la valor: Con >> que dependerá de la de más alto valor de bits (conocido como extensión de signo) y con >>> que siempre será 0.

    gracias por el comentario. puede usted explicar cuál es el significado de la escritura & 0xFF? y ¿cuál es la diferencia entre esto y simplemente escribir», num1 = nirbinary >> 24`, como fue sugerido aquí?
    para num1 no hay ninguna diferencia (porque num1 es «almacenada» en los 8 bits superiores de nirbnary). Pero para num2, num3 y num4 su para eliminar la mayor bits que almacenan los otros números (por ejemplo, si usted hizo nirbinary >> 16 te gustaría obtener algún valor que contiene num2 en el menor de 8 bits y num1 en los siguientes 8 bits). El & 0xFF conjuntos de todos los bits, excepto para el menor de 8 queridos a cero, la eliminación eficaz de los otros valores.
    Sobre todo gracias por la nota. He aprendido algo nuevo. 🙂

    OriginalEl autor Joachim Sauer

  2. 14

    No estoy completamente seguro de lo que te falta, así que me limitaré a explicar cómo se puede convertir a enteros cadenas binarias de ida y vuelta en java.

    Usted puede obtener una cadena binaria de un número entero tal que así:

    int i = 1234;
    String binString = Integer.toBinaryString(i);

    y usted puede convertir la cadena a un entero de esta manera:

    int iNew = Integer.parseInt(binString, 2);

    Nota el segundo argumento Entero.parseInt() es la base deseada de la serie. 2 es binario, 8 es octal, decimal 10, etc.

    Gracias por el comentario.No quiero trabajar con cadenas. Quiero trabajar sólo con este tipo de representación binaria, y lo que es más intresting para mí es cómo a partir de este int nirbinary puedo volver num1, por ejemplo.
    Ah, bien. A continuación, las otras respuestas probablemente será de más ayuda 😀

    OriginalEl autor jberg

  3. 2

    Cuando se trabaja con bitshifting y enteros recomendaría usted piensa en números hexadecimales, que por lo general hacen la vida mucho más fácil. Sólo ten en cuenta que los 8 bits representan 1 byte 1 byte cubre el hex-rango de 0x00 a 0xFF

    Desde num1 a num4 son menor que 10, su representación decimal es igual a su hex representiation, es decir, 1 = 0x01, 2 = 0x02 etc..
    Como le dije a usted: 1 Byte son 8 bits. En su bitshifting operación siempre cambio múltiplo de 8.

    • Así 0x01 << 8 => 0x0100
    • 0x01 << 16 => 0x010000
    • etc.

    Así que, básicamente, sólo añadir cero bytes, que, por supuesto, aumenta el valor.
    Lo que hacer a continuación es, un bit a bit o. Esto significa que los dos campos de bits conseguir modificado de tal manera que el resultado tiene un 1 en un solo lugar, si al menos uno de los valores de entrada como un 1. Desde su desplazado enteros contienen sólo el cero en la parte de atrás, un bit a bit o no es otra cosa que poner el valor en este punto.
    E. g:

    (0x01 << 8) | 0x02

    0x01 << 8 producirá 0x0100. Ahora sólo tiene que sustituir el último 00 con 02, ya que usted o ellos: 0x0102

    Si quieres recrear el original de la int, hay que enmascarar la parte que int representa (esto es fácil, ya que las partes no se superponen en su ejemplo) y, a continuación, cambiar de nuevo.

    E. g.
    Decir ou producido 0x010203 y quiere tener sólo 0x02. Ahora tiene a la máscara de turno de nuevo 0x010203 >> 8, lo que pondrá al 02 en la última parte. Ahora simplemente la máscara de esta última parte 0x0102 && 0xFF. Esto cambiará todo, pero los últimos 8 bits a cero

    OriginalEl autor Chris

  4. 2

    Cada int es un número, no es binario, hexadecimal o decimal, es sólo un número. la declaración de (num1 << 24) | (num2 << 16) | (num3 << 8) | num4; es un binario manipulación de 4 ints en otro int. No cambia la representación de nirbinary a binario, ya que nirbinary no tiene representación, porque (de nuevo) es sólo un número.

    Integer.toBinaryString(nirbinary) devuelve la representación binaria de nirbinary que significa «¿cómo nibinary en base 2».

    Si usted tiene una Cadena que es una representación binaria de un número, usted podría obtener su valor, mediante el uso de Integer.parseint(yourbinaryrepresentation, yourbase); por ejemplo – Integer.parseint(nir, 2);

    Y otra cosa:

    No siempre se puede volver a uno de los números de la espalda de nirbinary, ya que se realiza una manipulación de bits que no es reversible, por ejemplo:

    int i1 = 5;   //binary 0101
    int i2 = 4;   //binary 0100
    int i3 = i1 | i2;  //binary 0101

    usted no puede reconocer cada una de sus variables (i1, i2), ya que tienen en común un poco, i3 podría haber sido el resultado de or en otros dos números:

    int i1 = 1;   //binary 0101
    int i2 = 4;   //binary 0100
    int i3 = i1 | i2;  //binary 0101

    en su caso, si cada número es menor que 256, usted puede invertir con la siguiente operación:

    int myoldnumber = (nirbinary >> previousShift) & 0xff;

    por ejemplo, para recuperar num1 que usted puede hacer:

    int retrievedNum1 = (nirbinary >> 24) & 0xff;

    OriginalEl autor MByD

  5. 1

    Aquí no hay necesidad de depender sólo en binario o en cualquier otro formato…
    uno flexible, construido en la función está disponible
    Que imprime cualquiera de los formatos que quieres en tu programa..

    Integer.toString(int,representation);
    
    Integer.toString(100,8)   //prints 144 --octal representation
    
    Integer.toString(100,2)  //prints 1100100 --binary representation
    
    Integer.toString(100,16) //prints 64  --Hex representation
    
    Integer.toString(100,5) //prints 400  --Base 5

    OriginalEl autor Mohasin Ali

  6. 0
    1. es básicamente 1 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
    2. Usted puede conseguir num1 haciendo num1 = nirbinary >> 24.

    OriginalEl autor Thomas

  7. 0
    1. ¿Qué esperabas?
    2. Para obtener el byte más significativo de un int i:

    (i >> 24) & 0xff

    OriginalEl autor Ingo

Dejar respuesta

Please enter your comment!
Please enter your name here