Tutorial Java “Bit Shifting”?

Estaría agradecido por un buen tutorial, que explique a los novatos de Java cómo en Java funciona todo el “cambio de bit”.

Siempre me tropiezo con eso, pero nunca entendí cómo funciona. Debería explicar todas las operaciones y conceptos que son posibles con byteshifting / bitmanipulation en java.

Esto es solo un ejemplo de lo que quiero decir, (pero estoy buscando un tutorial que explique todas las operaciones posibles):

byte b = (byte)(l >> (8 - i << 3)); 

Bueno, el tutorial oficial de Java Bitwise y Bit Shift Operators cubre las operaciones reales que están disponibles en Java y cómo invocarlas.

Si te estás preguntando “¿qué puedo hacer con el cambio de bit?”, Eso no es específico de Java, y como es una técnica de bajo nivel, no conozco ninguna lista de “cosas geniales que puedas” hacer por sí misma. Valdría la pena familiarizarse con las definiciones y mantener los ojos abiertos para otro código donde se usa, para ver qué han hecho.

Tenga en cuenta que, a menudo, el intercambio de bits es una ganancia de eficiencia a expensas de la claridad. Por ejemplo, a << 1 suele ser el mismo que a * 2 pero podría decirse que es menos claro. Los XOR repetidos pueden intercambiar dos números sin usar una variable temporal, pero generalmente se considera mejor forma de escribir el código más claramente con la variable temporal (o incluso mejor, en un método de utilidad). Por lo tanto, a este respecto, es difícil dar buenos ejemplos, porque no es probable que consigas algo nuevo o profundo a nivel arquitectónico; se trata de los detalles de bajo nivel. (Y estimaría que una gran cantidad de usos de "twiddling" en la naturaleza son ejemplos de optimización prematura).

Cuando use el operador de desplazamiento, tenga mucho cuidado de no repetir un error común.

Como sugiere la siguiente publicación SO , el autor de la respuesta aceptada menciona:

“En algunos idiomas, la aplicación de los operadores de desplazamiento a cualquier tipo de datos más pequeño que int cambia automáticamente el tamaño del operando para que sea un int”.

Esto es absolutamente crucial para recordar cuando se trabaja con bytes, por ejemplo; de lo contrario, puede obtener resultados inesperados (como yo lo hice).

Dado un byte con el siguiente patrón de bits:

 1001 0000 

Cuando intenté cambiar el bit por 4, y se asignó a un int, como por ejemplo:

 int value = byteValue >>> 4; 

Esperaría tener:

 0000 1001 (or a value of 9) 

¡Pero obtendría un gran número! Esto se debe a que byteValue se convierte en int ANTES de la operación de cambio de bit, lo que da como resultado algo como esto:

 1111 1111 1111 1111 1111 1111 1001 

Hay un número infinito de combinaciones posibles. Sin embargo, estarán formados por una o más combinaciones de

 >> shift right with sign extension. >>> shift right with out sign extension. << shift left. 

Para entender, te sugiero que escribas los números binarios en papel y resuelvas qué sucede. Tratar de leerlo en un tutorial no garantiza la comprensión. especialmente si no han ayudado hasta ahora.

Hay un tutorial simple pero claro que encuentro útil aquí

No es exactamente un tutorial, pero tengo una biblioteca personal de funciones de cambio de bits en Java, ¡que le invito a estudiar!

Además, si haces una búsqueda en Google de “trucos a nivel de bit” , encontrarás mucho material. Muchos de ellos están en C / C ++, pero en general son triviales para convertirse a Java, ya que la mayoría de la syntax es la misma.

Aquí están los detalles de cómo funciona el cambio de bit . Hay un comportamiento no intuitivo que no está cubierto por el tutorial oficial. Por ejemplo, el operando derecho tiene un rango limitado (0-31 para int, 0-63 para long), y no generará una advertencia si excede ese rango; truncará los bits (es decir,% 32 o% 64). ), lo que puede dar un comportamiento diferente al esperado.

Este sitio parece ser un buen tutorial sobre lo que puedes hacer con la manipulación de bits (por lo que no es específico de Java, pero es bastante fácil de traducir)

http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html

El tutorial anterior proporciona

  • Operaciones Bitwise
  • Configuración y borrado de un bit
  • Mostrar un entero con bits
  • Conversión de decimal a hexadecimal
  • Número de bits establecidos en un entero (número de bits)
  • La posición del conjunto de bits de un entero
  • Intercambio de enteros en el sitio con manipulación de bits
  • El número de bits requeridos para convertir un entero A en entero B
  • Intercambie bits impares e pares en un entero
  • ¿Qué (n & (n-1) == 0) está revisando?
  • Complemento de dos
  • Volteando el n-ésimo bit de un entero
  • Número de punto flotante Patrón de bits
  • Patrón de bits palindrome de un entero

Aquí hay un archivo que tiene un montón de implementaciones de Java

http://geekviewpoint.com/

Estos son dos buenos tutoriales que encontré mientras aprendía sobre el cambio de bit, no están en Java, pero la mayoría de los lenguajes usan los mismos operadores y la teoría es la misma.

  1. Bit twiddling
  2. Tutorial de PHP Bitwise por Jim Plush