Я тот, кто пишет код просто для развлечения и не особо углублялся в него ни в академической, ни в профессиональной среде, поэтому такие вещи, как эти побитовые операторы, действительно ускользают от меня.
Я читал статью о JavaScript, который явно поддерживает побитовые операции. Я все время вижу, что эта операция упоминается местами, и я пытался прочитать, чтобы выяснить, что именно, но я просто, похоже, не понимаю ее вообще. Так что они? Было бы здорово использовать наглядные примеры! : D
Еще несколько вопросов - каковы практические применения побитовых операций? Когда вы можете их использовать?
Ответы:
Поскольку никто не затронул тему, почему они полезны:
Я много использую побитовые операции при работе с флагами. Например, если вы хотите передать ряд флагов операции (скажем,
File.Open()
с включенными режимами чтения и записи), вы можете передать их как одно значение. Это достигается путем присвоения каждому возможному флагу собственного бита в битовом наборе (byte, short, int или long). Например:Итак, если вы хотите передать чтение И запись, вы должны передать (READ | WRITE), который затем объединяет два в
Что затем можно расшифровать на другом конце, например:
который проверяет
который возвращается
который не равен 0, поэтому флаг указывает READ.
Вы можете использовать XOR для переключения различных битов. Я использовал это при использовании флага для указания направленных входов (вверх, вниз, влево, вправо). Например, если спрайт движется горизонтально, и я хочу, чтобы он повернулся:
Я просто выполняю XOR текущего значения с помощью (LEFT | RIGHT), который в этом случае отключает LEFT и RIGHT.
Битовый сдвиг полезен в нескольких случаях.
такой же как
если вам нужно быстро умножить на степень двойки, но следите за тем, чтобы 1 бит не сдвигался в верхний бит - это делает число отрицательным, если оно не беззнаковое. Это также полезно при работе с данными разного размера. Например, чтение целого числа из четырех байтов:
Предполагая, что A - самый старший байт, а D - младший. В итоге получилось бы:
Цвета часто хранятся таким образом (причем старший байт либо игнорируется, либо используется как альфа):
Чтобы снова найти значения, просто сдвиньте биты вправо, пока они не окажутся внизу, а затем замаскируйте оставшиеся биты более высокого порядка:
0xFF
такое же, как11111111
. По сути, для Red вы бы сделали это:источник
Стоит отметить, что однобитовые таблицы истинности, перечисленные в качестве других ответов, работают только с одним или двумя входными битами одновременно. Что происходит, когда вы используете целые числа, например:
Ответ заключается в двоичном разложении каждого входа:
Каждая пара битов в каждом столбце обрабатывается функцией «И», чтобы получить соответствующий выходной бит в нижней строке. Итак, ответ на приведенное выше выражение - 4. ЦП выполнил (в этом примере) 8 отдельных операций «И» параллельно, по одной для каждого столбца.
Я упоминаю об этом, потому что до сих пор помню это «АГА!». момент, когда я узнал об этом много лет назад.
источник
Побитовые операторы - это операторы, которые работают понемногу.
И равно 1, только если оба его входа равны 1.
ИЛИ равно 1, если один или несколько его входов равны 1.
XOR равен 1, только если ровно один из его входов равен 1.
НЕ равно 1, только если его вход равен 0.
Их лучше всего описать как таблицы истинности. Возможности входов находятся вверху и слева, результирующий бит - одно из четырех (два в случае НЕ, поскольку он имеет только один вход) значений, показанных на пересечении двух входов.
Одним из примеров является то, что если вам нужны только младшие 4 бита целого числа, вы И его с 15 (двоичный 1111), поэтому:
источник
Все эти побитовые операторы поддерживаются в JavaScript:
op1 & op2
-AND
Оператор сравнивает два бита и генерирует результат 1, если оба бита равны 1; в противном случае возвращается 0.op1 | op2
-OR
Оператор сравнивает два бита и выдает результат 1, если биты дополняют друг друга; в противном случае возвращается 0.op1 ^ op2
-EXCLUSIVE-OR
Оператор сравнивает два бита и возвращает 1, если один из битов равен 1, и дает 0, если оба бита равны 0 или 1.~op1
-COMPLEMENT
Оператор используется для инвертирования всех битов операнда.op1 << op2
-SHIFT LEFT
Оператор перемещает биты влево, отбрасывает крайний левый бит и присваивает крайнему правому биту значение 0. Каждое перемещение влево эффективно умножает op1 на 2.op1 >> op2
-SHIFT RIGHT
Оператор перемещает биты вправо, отбрасывает крайний правый бит и присваивает крайнему левому биту значение 0. Каждое движение вправо эффективно делит op1 пополам. Самый левый бит знака сохраняется.op1 >>> op2
- ОператорSHIFT RIGHT
-ZERO FILL
перемещает биты вправо, отбрасывает крайний правый бит и присваивает крайнему левому биту значение 0. Каждое перемещение вправо фактически делит op1 пополам. Самый левый бит знака отбрасывается.источник
1 | 1
дает,1
а не нет0
, и чем|
тогда должно отличаться от^
. Несколько дней назад мне пришлось использовать этот вопрос / ответ в качестве дублирующей цели, и мне хотелось, чтобы через 10 лет у кого-то был более четкий канонический дубликат для такого рода вопросов.Чтобы разбить его немного больше, он имеет много общего с двоичным представлением рассматриваемого значения.
Надеюсь это поможет.
источник
|
такое ИЛИ операции?x | y = 1000 0001 |
части , хотяКогда упоминается термин «поразрядный», иногда уточняется, что это не «логический» оператор.
Например, в JavaScript побитовые операторы обрабатывают свои операнды как последовательность из 32 бит (нулей и единиц) ; Между тем, логические операторы обычно используются с логическими (логическими) значениями, но могут работать с не-логическими типами.
Возьмем, к примеру, expr1 && expr2.
Как отмечали другие, 2 и 4 - это побитовое И, поэтому оно вернет 0.
Вы можете скопировать следующее в test.html или что-то еще и протестировать:
источник
операции :
побитовое И
побитовое ИЛИ
побитовое НЕ
побитовое XOR
и т.д
Элемент списка
Например.
Использование побитового оператора
Например.
Например.
if else
инструкцииНапример.
Например.
побитовое смещение работает только с положительным числом
Также существует широкий спектр использования побитовой логики.
источник
The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.
Это правильно! muyiy.cn/question/program/102.htmlЭто может помочь думать об этом так. Вот как работает AND (&):
Он в основном говорит, что оба этих числа едины, поэтому, если у вас есть два числа 5 и 3, они будут преобразованы в двоичные, и компьютер будет думать
оба едины: 00000001 0 - ложь, 1 - истина
Итак, И 5 и 3 равно единице. Оператор OR (|) делает то же самое, за исключением того, что для вывода 1 только одно из чисел должно быть равно единице, а не обоим.
источник
Я все время слышал о том, насколько медленными были побитовые операторы JavaScript. Я провел несколько тестов для моего последнего сообщения в блоге и обнаружил, что они были на 40-80% быстрее, чем арифметическая альтернатива в нескольких тестах. Возможно, раньше они были медленными. В современных браузерах я их люблю.
В моем коде есть один случай, который из-за этого будет быстрее и легче читать. Я буду держать глаза открытыми для большего.
источник