¿Cómo Funciona El Bitwise & (AND) En Java?


Estaba leyendo algunos ejemplos de código y me encontré con un & en el sitio web de Oracle en su Bitwise y Bit Shift Operadores página. En mi opinión no hizo demasiado bien un trabajo explicando el bitwise &. Entiendo que hace una operación directamente a la bit, pero no estoy seguro de qué tipo de operación, y me pregunto cuál es esa operación. Aquí hay un programa de ejemplo que me bajé del sitio web de Oracle: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.java

Author: Anzwur, 2013-06-23

6 answers

Un entero se representa como una secuencia de bits en memoria. Para la interacción con los humanos, la computadora tiene que mostrarlo como dígitos decimales, pero todos los cálculos se realizan como binarios. 123 en decimal se almacena como 1111011 en memoria.

El operador & es un "Y"bit a bit. El resultado son los bits que se activan en ambos números. 1001 & 1100 = 1000, ya que solo el primer bit está activado en ambos.

El operador | es un "Or"bitwise. El resultado son los bits que son encendido en cualquiera de los números. 1001 | 1100 = 1101, ya que solo el segundo bit de la derecha es cero en ambos.

También existen los operadores ^ y ~, que son bit a bit "Xor" y bit a bit "Not", respectivamente. Finalmente están los <<, >> y >>> operadores de turno.


Bajo el capó, 123 se almacena como 01111011 00000000 00000000 00000000 o 00000000 00000000 00000000 01111011, dependiendo del sistema. Usando los operadores bitwise, qué representación se utiliza no importa, ya que ambas representaciones se tratan como el número lógico 00000000000000000000000001111011. Pelar las hojas de ceros anteriores 1111011.

 59
Author: Markus Jarderot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-29 00:38:27

Es un binario y operador. Realiza una operación AND que es parte de Lógica booleana que se usa comúnmente en números binarios en computación.

Por ejemplo:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

También puede realizar esto en números de varios bits:

01 & 00 = 00
11 & 00 = 00
11 & 01 = 01
1111 & 0101 = 0101
11111111 & 01101101 = 01101101
...
 9
Author: Alex W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-23 00:39:31

Si nos fijamos en dos números representados en binario, a bitwise & crea un tercer número que tiene un 1 en cada lugar que ambos números tienen un 1. (En todas partes hay ceros).


Ejemplo:
0b10011011 &
0b10100010 =
0b10000010


Tenga en cuenta que unos solo aparecen en un lugar cuando ambos argumentos tienen uno en ese lugar.
Las AND Bitwise son útiles cuando cada bit de un número almacena una información específica.
También puede usarlos para eliminar / extraer ciertas secciones de números mediante el uso de máscaras.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-23 00:45:30

Si expande las dos variables de acuerdo con su código hexadecimal, estas son:

bitmask : 0000 0000 0000 1111
val:      0010 0010 0010 0010

Ahora, una simple operación a nivel de bits Y resulta en el número 0000 0000 0000 0010, que en unidades decimales es 2. Supongo que conoces las operaciones booleanas fundamentales y los sistemas numéricos.

 3
Author: dotslash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-23 00:43:05

Es una operación lógica en los valores de entrada. Para entender convertir los valores en la forma binaria y donde los bits de bot en la posición n tienen un 1 el resultado tiene un 1. Al final convertir de nuevo.

Por ejemplo con esos valores de ejemplo:

0x2222 =  10001000100010
0x000F =  00000000001111
result =  00000000000010   => 0x0002 or just 2
 1
Author: clearwater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-23 00:44:02
import.java.io.*;
import.java.util.*;

public class Test {
    public static void main(String[] args) {
        int rmv,rmv1;

        //this R.M.VIVEK complete bitwise program for java
        Scanner vivek=new Scanner();
        System.out.println("ENTER THE X value");
        rmv = vivek.nextInt();
        System.out.println("ENTER THE y value");
        rmv1 = vivek.nextInt();

        System.out.println("AND table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv&rmv1);//11=1,10=0
        System.out.println("OR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv|rmv1);//10=1,00=0
        System.out.println("xOR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv^rmv1);
        System.out.println("LEFT SWITH based to %d>>4=%d\n",rmv<<4);
        System.out.println("RIGTH SWITH based to %d>>2=%d\n",rmv>>2);

        for(int v=1;v<=10;v++)
            System.out.println("LIFT SWITH based to (-NAGATIVE VALUE) -1<<%d=%p\n",i,-1<<1+i);
    }
}
 -1
Author: R.M.VIVEK Arni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-20 14:32:31