Soy alguien que escribe código solo por diversión y realmente no he profundizado en él, ya sea en un entorno académico o profesional, así que cosas como estos operadores bit a bit realmente se me escapan.
Estaba leyendo un artículo sobre JavaScript, que aparentemente admite operaciones bit a bit. Sigo viendo esta operación mencionada en algunos lugares, y he intentado leer para averiguar qué es exactamente, pero parece que no lo entiendo en absoluto. Entonces, ¿qué son? ¡Ejemplos claros serían geniales! :RE
Solo unas pocas preguntas más: ¿cuáles son algunas aplicaciones prácticas de las operaciones bit a bit? ¿Cuándo podrías usarlos?
javascript
boolean
bitwise-operators
boolean-logic
hacer clic
fuente
fuente
Respuestas:
Como nadie ha abordado el tema de por qué son útiles:
Utilizo mucho las operaciones bit a bit cuando trabajo con banderas. Por ejemplo, si desea pasar una serie de banderas a una operación (por ejemplo,
File.Open()
, con el modo de lectura y el modo de escritura habilitados), puede pasarlos como un solo valor. Esto se logra asignando a cada indicador posible su propio bit en un conjunto de bits (byte, short, int o long). Por ejemplo:Entonces, si desea pasar de lectura Y escritura, pasaría (LEER | ESCRIBIR) que luego combina los dos en
Que luego se puede descifrar en el otro extremo como:
que verifica
que vuelve
que no es 0, por lo que el indicador especifica READ.
Puede usar XOR para alternar varios bits. Lo he usado cuando uso una bandera para especificar entradas direccionales (Arriba, Abajo, Izquierda, Derecha). Por ejemplo, si un sprite se mueve horizontalmente y quiero que se dé la vuelta:
Simplemente XOR el valor actual con (IZQUIERDA | DERECHA) que apagará IZQUIERDA y DERECHA, en este caso.
Bit Shifting es útil en varios casos.
es lo mismo que
si necesita multiplicar rápidamente por una potencia de dos, pero tenga cuidado con el cambio de 1 bit al bit superior; esto hace que el número sea negativo a menos que no esté firmado. También es útil cuando se trata con diferentes tamaños de datos. Por ejemplo, leer un número entero de cuatro bytes:
Suponiendo que A es el byte más significativo y D el menor. Terminaría como:
Los colores a menudo se almacenan de esta manera (con el byte más significativo ignorado o utilizado como Alfa):
Para encontrar los valores nuevamente, simplemente mueva los bits hacia la derecha hasta que esté en la parte inferior, luego oculte los bits restantes de orden superior:
0xFF
es el mismo que11111111
. Entonces, esencialmente, para Red, estarías haciendo esto:fuente
Vale la pena señalar que las tablas de verdad de un solo bit enumeradas como otras respuestas funcionan en solo uno o dos bits de entrada a la vez. Qué sucede cuando usas enteros, como:
La respuesta está en la expansión binaria de cada entrada:
Cada par de bits en cada columna se ejecuta a través de la función "Y" para dar el bit de salida correspondiente en la línea inferior. Entonces, la respuesta a la expresión anterior es 4. La CPU ha realizado (en este ejemplo) 8 operaciones "Y" separadas en paralelo, una para cada columna.
Menciono esto porque todavía recuerdo haber tenido este "¡AHA!" momento en que me enteré de esto hace muchos años.
fuente
Los operadores bit a bit son operadores que trabajan en un bit a la vez.
AND es 1 solo si sus dos entradas son 1.
OR es 1 si una o más de sus entradas son 1.
XOR es 1 solo si exactamente una de sus entradas es 1.
NOT es 1 solo si su entrada es 0.
Estos se pueden describir mejor como tablas de verdad. Las posibilidades de entrada están en la parte superior e izquierda, el bit resultante es uno de los cuatro valores (dos en el caso de NOT ya que solo tiene una entrada) que se muestran en la intersección de las dos entradas.
Un ejemplo es si solo desea los 4 bits inferiores de un número entero, Y lo hace con 15 (binario 1111) así que:
fuente
Estos son los operadores bit a bit, todos compatibles con JavaScript:
op1 & op2
- ElAND
operador compara dos bits y genera un resultado de 1 si ambos bits son 1; de lo contrario, devuelve 0.op1 | op2
- ElOR
operador compara dos bits y genera un resultado de 1 si los bits son complementarios; de lo contrario, devuelve 0.op1 ^ op2
- ElEXCLUSIVE-OR
operador compara dos bits y devuelve 1 si alguno de los bits es 1 y da 0 si ambos bits son 0 o 1.~op1
- ElCOMPLEMENT
operador se utiliza para invertir todos los bits del operando.op1 << op2
- ElSHIFT LEFT
operador mueve los bits hacia la izquierda, descarta el bit más a la izquierda y asigna al bit más a la derecha un valor de 0. Cada movimiento hacia la izquierda multiplica efectivamente op1 por 2.op1 >> op2
- ElSHIFT RIGHT
operador mueve los bits hacia la derecha, descarta el bit más a la derecha y asigna al bit más a la izquierda un valor de 0. Cada movimiento hacia la derecha divide efectivamente op1 por la mitad. El bit de signo más a la izquierda se conserva.op1 >>> op2
- El operadorSHIFT RIGHT
-ZERO FILL
mueve los bits hacia la derecha, descarta el bit más a la derecha y asigna al bit más a la izquierda un valor de 0. Cada movimiento hacia la derecha divide efectivamente op1 por la mitad. El bit de signo más a la izquierda se descarta.fuente
1 | 1
da1
y no0
, y cómo|
se supone que es diferente^
. Tuve que usar este Q / A como un objetivo duplicado hace unos días, y deseé que después de 10 años uno tuviera un duplicado canónico más claro para este tipo de preguntas.Para desglosarlo un poco más, tiene mucho que ver con la representación binaria del valor en cuestión.
Espero que esto ayude.
fuente
|
es un quirófano?x | y = 1000 0001 |
parteCuando se menciona el término "bit a bit", a veces aclara que no es un operador "lógico".
Por ejemplo, en JavaScript, los operadores bit a bit tratan sus operandos como una secuencia de 32 bits (ceros y unos) ; mientras tanto, los operadores lógicos generalmente se usan con valores booleanos (lógicos) pero pueden funcionar con tipos no booleanos.
Tome expr1 && expr2 por ejemplo.
Como otros han señalado, 2 y 4 es un AND bit a bit, por lo que devolverá 0.
Puede copiar lo siguiente a test.html o algo y probar:
fuente
operaciones :
bitwise Y
bitwise O
NO bit a bit
bitor XOR
etc.
Elemento de la lista
P.ej.
Usos del operador bit a bit
P.ej.
P.ej.
if else
declaraciónP.ej.
P.ej.
el desplazamiento a nivel de bits solo funciona con + ve número
También hay una amplia gama de uso de lógica bit a bit
fuente
The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.
¡Así es! muyiy.cn/question/program/102.htmlPuede ser útil pensar de esta manera. Así es como funciona AND (&):
Básicamente dice que son ambos números, así que si tienes dos números 5 y 3 se convertirán en binarios y la computadora pensará
ambos son uno: 00000001 0 es falso, 1 es verdadero
Entonces el AND de 5 y 3 es uno. El operador OR (|) hace lo mismo, excepto que solo uno de los números debe ser uno para la salida 1, no ambos.
fuente
Seguía escuchando lo lentos que eran los operadores de JavaScript a nivel de bits. Hice algunas pruebas para mi última publicación de blog y descubrí que eran 40% a 80% más rápidas que la alternativa aritmética en varias pruebas. Quizás solían ser lentos. En los navegadores modernos, los amo.
Tengo un caso en mi código que será más rápido y fácil de leer debido a esto. Mantendré mis ojos abiertos por más.
fuente