2012-05-02 100 views
11

我在一些JS代码看到这个:操作符是什么“>>”(双箭头)和“|” (单管)在JavaScript中的意思?

 index = [ 
      ascii[0] >> 2, 
      ((ascii[0] & 3) << 4) | ascii[1] >> 4, 
      ((ascii[1] & 15) << 2) | ascii[2] >> 6, 
      ascii[2] & 63 
     ]; 

我挺想知道什么了很多,这意味着。具体来说“>>”,单个管道“|”和最后一行中的“&”符号?

非常感谢!

+3

二元运算符。 – Pointy

+1

(-1)搜索“JavaScript运算符”... -1,因为这是易于获得的信息*和*在StackOverflow中已经非常常见。 – 2012-05-02 22:52:01

+2

http://stackoverflow.com/questions/6194950/single-pipe-in​​-javascript,http://stackoverflow.com/questions/6997909/what-do-and-mean-in-javascript – 2012-05-02 22:53:50

回答

16

x >> yy地方来的x位转移右边(<<在左边)。

x | y装置的xy的位比较,把一个1在每个比特如果任xy具有在该位置一个1

x & y相同|,除了结果是1如果BOTH xy具有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 

有关详细信息,search Google for "bitwise operators"

+0

稍微详细一点[解释](http://digitalfortress.tech/js/double-arrow-js-bitwise-operator/),以防你仍然不太确信。 –

7

>>是一个正确的按位移。它需要位并将它们右移n地点。例如,让我们来看看35 >> 2

35 = 100011 shift two places 
    001000 = 8 

事实上,35 >> 2 == 8


|是一个按位或。它需要每个操作数中的每一位并将它们组合在一起。你可以将它想象成一种二元加法,但是当顶部和底部都是1时,你不会携带。例如,这里的5 | 3

5 = 101 
3 = 011 
| ----- 
    111 = 7 

事实上,5 | 3 == 7


最后,&是一个按位与。它取每个操作数中的每一位,除非一个位或另一个是1,否则给出1,如果一个位和另一个都是1,则给出1。例如,这里是5 & 3

5 = 101 
3 = 011 
& ----- 
    001 = 1 

试一试; 5 & 3 == 1


你可能想知道是<<,这是左按位移位运算的一些其他的,和^,这是一个XOR(0时两个位相同,1,如果它们是不同的) 。

实际上,n值模数为32 1 >> 321。不知道为什么。

+1

非常感谢您提供有帮助的,非语言化的答案。 – Ashe

+0

这应该是例外答案!很好的解释 – DoubleA

1
  • &(按位与)
  • | (按位OR)
  • < <(左移位)
  • >>(注册传播右移)

实例(从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 < < 2位二进制移位,2位移位):

 9 (base 10): 00000000000000000000000000001001 (base 2) 
        -------------------------------- 
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10) 
3

>><<运营商是一个按位移。例如,

11 =  00001011 
11 << 3 = 01011000 = 88 

值得注意的是m << n = m * 2^nm >> 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