significado significa que 0xff java byte unsigned bits complement

significa - ¿Cómo puedo invertir bits de un byte sin firmar en Java?



>> java (7)

Aquí están los bytes de Java, ordenados por representación binaria (desde 00000000 hasta 11111111):

0, 1, 2, .., 126, 127, -128, -127, .., -2, -1

00000000 es 0, 11111111 es -1

El 0 invertido es -1, el 1 invertido es -2, ..., el 127 invertido es -128. Por lo tanto, si desea invertir bits de un byte Java, debe obtener su byte con el signo opuesto y restar uno:

byte myByte = 123; byte myInvertedByte = -myByte-1;

Estoy tratando de escribir un decodificador para un tipo de cifrado muy simple. Los números del 0-255 se ingresan a través del Escáner, los bits se invierten y luego se convierten en un carácter y se imprimen.

Por ejemplo, el número 178 debería convertirse a la letra "M".

178 es 10110010.

La inversión de todos los bits debe dar 01001101, que es 77 o "M" como un carácter.

El principal problema que tengo es que, por lo que puedo decir, Java no admite bytes sin firmar. Podría leer los valores como un int o un corto, pero luego los valores estarán desactivados durante la conversión debido a los bits adicionales. Lo ideal sería utilizar el operador de complemento bit a bit, pero creo que terminaré obteniendo valores negativos si hago esto con números firmados. ¿Alguna idea sobre cómo debo abordar esto?


La forma más fácil de hacer esto es tres etapas:

  1. Lea el valor como un int (32 bits en java). Puede ser negativo, pero de todos modos solo nos importan los 8 bits inferiores. int i = scanner.nextByte();
  2. Realice la inversión como un int usando operadores bitwise (como usted dice le dará 1s como bits de orden superior: i = ~i;
  3. Pierda los bits de orden superior con un AND lógico: i = i & 0xFF;

Luego solo use el resultado como un carácter (que en realidad es de 16 bits en java, pero solo usaremos 8 de ellos):

char c=(char)a; System.out.println(c);

Todos juntos:

int i = scanner.nextByte(); // change this to nextInt() depending on file format i = ~i; i = i & 0xFF; char c=(char)a; System.out.println(c);


Las operaciones bitwise en Java están definidas para int por lo que tiene sentido trabajar con int lugar de byte . Puede usar Scanner.nextInt , en lugar de Scanner.nextByte . Debe validar la entrada del usuario para asegurarse de que todos los enteros ingresados ​​estén en el rango de 0 a 255 y mostrar un mensaje de error adecuado si se encuentra un número fuera de rango.

Una vez que tenga el número almacenado en un número entero, para voltear los 8 bits menos significativos puede XOR con 0xff. Esto debería funcionar como espera para todas las entradas entre 0 y 255:

x ^= 0xff;

Ejemplo:

String input = "178 0 255"; Scanner s = new Scanner(input); while (s.hasNextInt()) { int x = s.nextInt(); if (x < 0 || x > 255) { System.err.println("Not in range 0-255: " + x); } else { x ^= 0xff; System.out.println(x); } }

Resultado:

77 255 0


Si Java lo admite, podría leerlo en un tipo más grande, complementario a nivel de bits, y luego enmascarar los bits no deseados.

int x = [your byte]; x = ~x & 0xFF;


Simplemente usaría los complementos y eliminaría los otros bits utilizando binario y.

public class Conv { public static void main(String[] args) { int val = 178; val = ~val & 0xff; System.out.println((char) val); } }


private byte reverseBitsByte(byte x) { int intSize = 8; byte y = 0; for (int position = intSize - 1; position >= 0; position--) { y += ((x & 1) << position); x >>= 1; } return y; }


~n & 0xff

~ hace el complemento y se convierte implícitamente en un entero como lo hacen todas las operaciones numéricas, entonces & 0xff enmascara todo excepto los 8 bits inferiores para obtener el valor sin signo, nuevamente como un entero.

Primero leí su pregunta de manera diferente, para invertir el orden en lugar de los valores de los bits, y esta fue la respuesta.

Puede usar Integer.reverse() (no probado):

Integer.reverse(n << 24) & 0xff