12

我在一些 JS 代码中看到了这一点:

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

我很想知道这意味着什么。特别是“>>”,单管道“|” 和最后一行的“&”符号?

非常感激!

4

5 回答 5

19

x >> y表示将 的位x向右y移动(<<向左)。

x | y表示比较 和 的位,x如果在该位置有或有 a ,则将ya1放入每个位。xy1

x & y与 相同|,只是结果是1if BOTHxyhave a 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

有关详细信息,请在Google 中搜索“位运算符”

于 2012-05-02T22:48:07.937 回答
8

>>是右移。它获取这些位并将它们向右移动n 个位置1。例如,让我们检查一下35 >> 2

35 = 100011 shift two places
     001000 = 8

确实,35 >> 2 == 8.


|是按位或。它获取每个操作数中的每一位并将它们或它们在一起。您可以将其设想为一种二进制加法,但当 top 和 bottom 都是1. 例如,这里是5 | 3

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

确实,5 | 3 == 7.


最后,&是按位与。它取每个操作数中的每一位,除了如果一位或另一位为 1 则不给出 1,如果一位 AND 另一位均为 1 则给出 1。例如,这里是5 & 3

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

试试看; 5 & 3 == 1.


您可能需要注意的其他一些是<<,这是一个左移位,以及^,这是一个 XOR(当两个位相同时为 0,如果它们不同则为 1)。

1实际上,它是 n 模 32。1 >> 321. 不知道为什么。

于 2012-05-02T22:51:03.590 回答
4

和运算>><<是按位移位。例如,

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
于 2012-05-02T22:55:45.380 回答
2
  • &(按位与)
  • | (按位或)
  • <<(左移)
  • >>(符号传播右移)

示例(来自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 将 9 的二进制位,左移 2 位):

     9 (base 10): 00000000000000000000000000001001 (base 2)
                  --------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)
于 2012-05-02T22:53:39.200 回答
1

在我看来像位运算符:

http://web.eecs.umich.edu/~bartlett/jsops.html

编辑:那个 ascii 数组是一个死的赠品......哈哈

于 2012-05-02T22:44:23.230 回答