我在一些JS代码中看到了这一点:
index = [
ascii[0] >> 2,
((ascii[0] & 3) << 4) | ascii[1] >> 4,
((ascii[1] & 15) << 2) | ascii[2] >> 6,
ascii[2] & 63
];
我很想知道这意味着什么。具体为“&gt;&gt;”,单个管道“|”和“&amp;”最后一行的符号?
非常感谢!
答案 0 :(得分:17)
x >> y
表示将x
的位置向y
位置向右移动(<<
向左)。
x | y
表示比较x
和y
的位,如果1
或x
有y
,则每个位都会加1
在该位置x & y
。
|
与1
相同,但如果x
和y
只有1
,则结果为#left-shifting 1 by 4 bits yields 16
1 << 4 = b00001 << 4 = b10000 = 16
#right-shifting 72 by 3 bits yields 9
72 >> 3 = b1001000 >> 3 = b1001 = 9
#OR-ing
8 | 2 = b1000 | b0010 = b1010 = 10
#AND-ing
6 & 3 = b110 & b011 = b010 = 2
。< / p>
示例:
{{1}}
答案 1 :(得分:7)
>>
是一个正确的按位移位。它需要位并将它们移位 n 位置 1 。例如,让我们检查一下35 >> 2
:
35 = 100011 shift two places
001000 = 8
确实,35 >> 2 == 8
。
|
是一个按位OR。它接受每个操作数中的每个位并将它们组合在一起。您可以将其视为一种二进制加法,但当顶部和底部都为1
时,您不会携带。例如,这里是5 | 3
:
5 = 101
3 = 011
| -----
111 = 7
确实,5 | 3 == 7
。
最后,&
是一个按位AND。它取每个操作数中的每一位,除了在一位或另一位为1时给出1,如果一位而另一位都是1则给出1。例如,这里是5 & 3
:
5 = 101
3 = 011
& -----
001 = 1
尝试一下; 5 & 3 == 1
。
您可能想要注意的其他一些是<<
,它是左按位移位,^
是一个XOR(当两个位相同时为0,如果它们为1则为1 “与众不同。”
1 实际上,它是n modulo 32. 1 >> 32
是1
。不确定原因。
答案 2 :(得分:4)
>>
和<<
运算符是按位移位的。例如,
11 = 00001011
11 << 3 = 01011000 = 88
值得注意的是m << n = m * 2^n
和m >> n = m / 2^n
。这有时用于以2的幂进行非常有效的乘法/除法。
&
和|
是按位和/或分别。
11 = 00001011
28 = 00011100
11 & 28 = 00001000 = 8
11 = 00001011
28 = 00011100
11 | 28 = 00011111 = 31
虽然我正在使用它,但我应该提到^
运算符,它不用于幂,而是用于按位异或 - 。
11 = 00001011
28 = 00011100
11 ^ 28 = 00010111 = 23
答案 3 :(得分:1)
答案 4 :(得分:1)
示例(来自https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators):
按位和:
9 (base 10) = 00000000000000000000000000001001 (base 2)
14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
左移(9&lt;&lt;&lt;&lt;&lt; 2&lt; 2&lt; 2&gt;位,二进制9位,左边2位):
9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)