traduccion operator operadores bitwise asignacion javascript bit-manipulation

javascript - operator - Operaciones bit a bit en entradas sin signo de 32 bits



operadores de asignacion en javascript (3)

Es feo, pero:

var a = 1986735448; var b = (a << 1) >>> 0; /* b = 3973470896 */

JavaScript convierte operandos en entradas firmadas de 32 bits antes de realizar operaciones en modo bit. También realiza la operación con entradas firmadas de 32 bits, lo que significa que el resultado es un int. Firmado 32 bits.

Como me gustaría hacer operaciones bit a bit con entradas sin signo de 32 bits, me pregunto si existe una forma de utilizar el resultado destrozado de JavaScript para descubrir el resultado deseado.

Para demostrar mi idea, por ejemplo, en C, que es la referencia de lo que me gustaría,

unsigned int a = 3774191835u; unsigned int b = a >> 2; /* b == 943547958 */

En JavaScript,

var a = 3774191835; var b = a >> 2; /* b == -130193866 */

Probemos esto con una operación diferente. Cª,

unsigned int a = 1986735448u; unsigned int b = a << 1; /* b == 3973470896 */

En JavaScript,

var a = 1986735448; var b = a << 1; /* b == -321496400 */

Ahora que JavaScript ha evaluado mi operación a nivel de bit con el operando como un int firmado, por supuesto, obtenemos un resultado diferente al que obtendríamos en C, donde podemos realizar operaciones a nivel de bits en ints sin signo.

Sé que es posible, pero no estoy seguro de que pueda, esencialmente, convertir el resultado de JavaScript en el resultado deseado.

Zero-fill right shift el resultado por cero funciona solo para el segundo caso, pero no el primero.

var a = 3774191835; var b = (a >> 2) >>> 0; /* b == 4164773430 */ var a = 1986735448; var b = (a << 1) >>> 0; /* b == 3973470896 */


JavaScript soluciona este problema ofreciendo dos operadores de desplazamiento de bit, >> y >>> . Quieres >>> hacer un cambio sin cambiar el bit de signo.


Solo tienes que seguir estas reglas:

  1. siempre termina operaciones de bits con >>> 0 para que el resultado se interprete como unsigned.
  2. no use >> . Si el bit más a la izquierda es 1 intentará preseve el signo y, por lo tanto, introducirá 1 ''s a la izquierda. Usa siempre >>> .

Ejemplos:

C: (3774191835 >> 2) | 2147483648 js: (3774191835 >>> 2 | 2147483648) >>> 0 C: 1986735448 << 1 js: (1986735448 << 1) >>> 0 C: 3774191835 & 4294967295 js: (3774191835 & 4294967295) >>> 0

Solo si la última operación es >>> , >>> 0 no es necesario.