Что делают операторы ">>" (двойная стрелка) и "|" (однотрубная) означает в JavaScript?

Я видел это в некотором JS-коде:

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

Мне бы очень хотелось узнать, что это значит. В частности, " → ", один канал "|" и "&" символ на последней строке?

Очень ценно!

Ответ 1

x >> y означает сдвиг бит x на y вправо (<< влево).

x | y означает сравнение бит x и y, поместив a 1 в каждый бит, если либо x, либо y имеет 1 в этой позиции.

x & y совпадает с |, за исключением того, что результат 1, если BOTH 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

Для получения дополнительной информации выполните поиск Google для "побитовых операторов" .

Ответ 2

>> - правильный побитовый сдвиг. Он принимает биты и сдвигает их вправо n мест 1. Например, рассмотрим 35 >> 2:

35 = 100011 shift two places
     001000 = 8

И действительно, 35 >> 2 == 8.


| - побитовое ИЛИ. Он принимает каждый бит в каждом операнде и ORs их вместе. Вы можете представить его как своего рода двоичное дополнение, но вы не носите, когда верх и низ 1. Например, здесь 5 | 3:

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

И действительно, 5 | 3 == 7.


Наконец, & является поразрядным И. Он берет каждый бит в каждом операнде, за исключением того, что вместо 1, если один бит ИЛИ другой - один, он дает 1, если один бит, а другой - один. Например, здесь 5 & 3:

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

Попробуйте; 5 & 3 == 1.


Некоторые другие, о которых вы, возможно, захотите узнать, - это <<, который представляет собой левый побитовый сдвиг и ^, который является XOR (0, когда оба бита одинаковы, 1, если они разные).

1 Собственно, это n по модулю 32. 1 >> 32 есть 1. Не уверен, почему.

Ответ 3

Операторы >> и << являются поразрядным сдвигом. Например,

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

Ответ 5

  • & (Побитовое И)
  • | (Побитовое ИЛИ)
  • < < (Сдвиг влево)
  • → (сдвиг вправо).

Примеры (из 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)