Buscar..


Operadores bitwise

Los operadores bitwise realizan operaciones en valores de bit de datos. Estos operadores convierten los operandos en enteros de 32 bits con signo en el complemento de dos .

Conversión a enteros de 32 bits

Los números con más de 32 bits descartan sus bits más significativos. Por ejemplo, el siguiente entero con más de 32 bits se convierte en un entero de 32 bits:

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

Complemento de dos

En binario normal, encontramos el valor binario sumando los 1 en función de su posición como potencias de 2: el bit más a la derecha es 2^0 al bit que está más a la izquierda siendo 2^n-1 donde n es el número de bits. Por ejemplo, usando 4 bits:

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

El formato de dos complementos significa que la contraparte negativa del número (6 vs -6) es todos los bits para un número invertido, más uno. Los bits invertidos de 6 serían:

// Normal binary
   0 1 1 0
// One's complement (all bits inverted)
   1 0 0 1  => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
   1 0 1 0  => -8 + 0 + 2 + 0 => -6

Nota: Agregar más 1 'a la izquierda de un número binario no cambia su valor en complemento a dos. El valor 1010 y 1111111111010 son ambos -6 .

Y a nivel de bit

La operación AND a nivel de bit a & b devuelve el valor binario con un 1 donde ambos operandos binarios tienen 1 en una posición específica y 0 en todas las demás posiciones. Por ejemplo:

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

Ejemplo del mundo real: el control de paridad de Number

En lugar de esta "obra maestra" (desafortunadamente muy a menudo vista en muchas partes de código real):

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

Puede verificar la paridad del número (entero) de una manera mucho más efectiva y simple:

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

Bitwise o

La operación bit a bit o a | b devuelve el valor binario con un 1 donde los operandos o ambos operandos tienen 1 en una posición específica, y 0 cuando ambos valores tienen 0 en una posición. Por ejemplo:

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

Bitwise NO

La operación NO a nivel de bits ~a cambia los bits del valor dado a . Esto significa que todos los 1 's se convertirán en 0 ' s y todos los 0 's se convertirán en 1 ' s.

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

Bitwise XOR

La operación XOR ( exclusiva o ) a nivel de bits a ^ b coloca a 1 solo si los dos bits son diferentes. Exclusivo o significa uno u otro, pero no ambos .

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

Ejemplo del mundo real: intercambio de dos valores enteros sin asignación de memoria adicional

var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11

Operadores de turno

Se puede pensar que el desplazamiento a nivel de bits "mueve" los bits hacia la izquierda o hacia la derecha y, por lo tanto, cambia el valor de los datos operados.

Shift izquierdo

El operador de desplazamiento a la izquierda (value) << (shift amount) desplazará los bits a la izquierda en bits (shift amount) ; los nuevos bits que vienen de la derecha serán 0 's:

5 << 2 => 20
//  5:      0..000101
// 20:      0..010100 <= adds two 0's to the right

Cambio a la derecha ( propagación de signos )

El operador de desplazamiento a la derecha (value) >> (shift amount) también se conoce como "desplazamiento a la derecha de propagación de la señal" porque mantiene la señal del operando inicial. El operador de desplazamiento a la derecha desplaza el value la shift amount de bits especificada de shift amount a la derecha. Los bits en exceso desplazados hacia la derecha se descartan. Los nuevos bits que vienen de la izquierda se basarán en el signo del operando inicial. Si el bit más a la izquierda era 1 entonces todos los nuevos bits serán 1 y viceversa para 0 's.

20 >> 2 => 5
// 20:      0..010100
//  5:      0..000101 <= added two 0's from the left and chopped off 00 from the right

-5 >> 3 => -1
// -5:      1..111011
// -2:      1..111111 <= added three 1's from the left and chopped off 011 from the right

Cambio a la derecha ( relleno cero )

El operador de desplazamiento a la derecha con relleno cero (value) >>> (shift amount) moverá los bits a la derecha, y los nuevos bits serán 0 's. Los 0 se desplazan desde la izquierda y los bits en exceso hacia la derecha se desplazan y se descartan. Esto significa que puede hacer números negativos en positivos.

-30 >>> 2 => 1073741816
//       -30:      111..1100010
//1073741816:      001..1111000

El desplazamiento a la derecha con relleno de cero y el desplazamiento a la derecha de propagación de signos producen el mismo resultado para los números no negativos.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow