Что делают операторы ">>" (двойная стрелка) и "|" (однотрубная) означает в 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
Ответ 4
Похоже на меня побитовые операторы:
http://web.eecs.umich.edu/~bartlett/jsops.html
Изменить: этот массив ascii был мертвым отдать... LOL
Ответ 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)