Javascript побитовые операции: Побитовые операторы
0001
JavaScript использует 32-битные побитовые операнды
JavaScript хранит числа как 64-битные числа с плавающей запятой,
но все побитовые операции выполняются с 32-битными двоичными числами.
Перед выполнением побитовой операции JavaScript преобразует числа в 32-битные целые числа со знаком.
После выполнения побитовой операции результат конвертируется обратно в 64-битные числа JavaScript.
В приведенных выше примерах используются 4-битные двоичные числа без знака. Из-за этого ~ 5 возвращает 10.
Поскольку JavaScript использует 32-битные целые числа со знаком, он не вернет 10. Он вернет -6.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
Целое число со знаком использует крайний левый бит как знак минус.
Побитовое AND JavaScript
Когда побитовое AND выполняется для пары битов, он возвращает 1, если оба бита равны 1.
Один битный пример:
Операция | Результат |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
4 битный пример:
Операция | Результат |
---|---|
1111 & 0000 | 0000 |
1111 & 0001 | 0001 |
1111 & 0010 | 0010 |
1111 & 0100 | 0100 |
Побитовое OR
Когда для пары битов выполняется побитовое OR, оно возвращает 1, если один из битов равен 1:
Один битный пример:
Операция | Результат |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
4 битный пример:
Операция | Результат |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
Побитовое XOR JavaScript
Когда побитовое XOR выполняется для пары битов, он возвращает 1, если биты различны:
Один битный пример:
Операция | Результат |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
4 битный пример:
Операция | Результат |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
Поразрядное AND (&) JavaScript
Побитовое AND возвращает 1, только если оба бита равны 1:
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 & 1 | 00000000000000000000000000000001 (1) |
Побитовое OR (|) JavaScript
Побитовое OR возвращает 1, если один из битов равен 1:
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Побитовое XOR (^) JavaScript
Побитовое XOR возвращает 1, если биты разные:
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
Побитовое NOT (~) JavaScript
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
~5 | 11111111111111111111111111111010 (-6) |
JavaScript (нулевое заполнение) Побитовый сдвиг влево (<<)
Это сдвиг влево с нулевым заполнением. Один или несколько нулевых бит вставляются справа, а крайние левые биты отпадают:
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
JavaScript (сохранение знака) Побитовый сдвиг вправо (>>)
Это знак, сохраняющий правый сдвиг. Копии крайнего левого бита вставляются слева, а крайние правые биты отваливаются:
Десятичный | Двоичный |
---|---|
-5 | 11111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111111101 (-3) |
JavaScript (нулевое заполнение) сдвиг вправо (>>>)
Это сдвиг вправо с нулевым заполнением. Один или несколько нулевых битов вставляются слева, а крайние правые биты отваливаются:
Десятичный | Двоичный |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
Двоичные числа
Двоичные числа с одним набором битов легко понять:
Двоичное представление | Десятичное значение |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Установка еще нескольких битов показывает двоичный паттерн:
Двоичное представление | Десятичное значение |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000001101 | 13 (8 + 4 + 1) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Двоичные числа JavaScript хранятся в формате дополнения до двух….
Я управляю некоторыми большими целыми числами (128~256bits) с помощью gmp. Дело дошло до того, что я хотел бы умножить их на двойник, близкий к 1 (0.1 < double < 10), причем результат все еще является приближенным целым числом. Хорошим примером операции, которую мне нужно сделать, является…
7
17516032
в двоичном коде — это 00000001000010110100011000000000
. Сдвиг влево на 7 дает вам 10000101101000110000000000000000
. Это равно -2052915200
в дополнении к двум (именно так почти все компьютеры представляют отрицательные числа).
>>
-это знаковый сдвиг вправо. Это означает, что крайний левый бит (который определяет знак числа) будет смещен в левую сторону.
напр.
1100 >> 2 == 1111
0111 >> 2 == 0001
Если вы хотите сделать сдвиг без знака (который игнорирует знаковый бит), используйте >>>
, который будет заполнять нулем левый конец битовой строки.
Поделиться
tskuzzy
27 июля 2011 в 16:28
3
Побитовые операторы работают с 32-битными целыми числами, в то время как умножение и деление работают с числами с плавающей запятой.
Когда вы сдвигаете число, оно преобразуется из числа с плавающей запятой в 32-битное целое число перед операциями и преобразуется обратно в число с плавающей запятой после операции. Число 2242052096 имеет 32-й битный набор, поэтому оно является отрицательным числом при преобразовании в 32-битное целое число и из него.
Оператор сдвига вправо >>
не изменяет знак значения, т. е. биты, сдвинутые влево, имеют то же значение, что и знаковый бит. Вместо этого используйте оператор >>>
right shift для сдвига нулевых битов.
Ссылка: MDN: побитовые операторы
Поделиться
Guffa
27 июля 2011 в 16:24
2
(2242052096 / 65536) == (2242052096 >>> 16)
Обратите внимание на другой сдвиг.
Поделиться
Griffin
27 июля 2011 в 16:28
- Побитовые операции в Pandas, которые возвращают числа, а не були?
Вопрос Как я могу выполнять побитовые операции в Pandas? Как & работает с целыми числами На целых числах оператор & выполняет побитовую маску >>> mask = 0b1100 # 4 and 8 bits on >>> 7 & mask 4 Как & работает в Pandas Есть ли какой-то способ выполнить побитовые…
- Побитовые операции над знаковыми большими целыми числами
Я пишу простой тип BigInteger в Delphi. Этот тип состоит из массива беззнаковых 32-битных целых чисел (я называю их конечностями), счетчика (или размера) и знакового бита. Значение в массиве интерпретируется как абсолютное значение, поэтому это представление знака-величины. Это имеет несколько…
1
Javascript обычно представляет числа в виде (двойной точности) с плавающей запятой.
Почти все побитовые операции преобразуются в 32-битное целое число со знаком, делают все, что они собираются делать, а затем обрабатывают результат как 32-битное целое число со знаком при обратном преобразовании.
Исключение составляет >>>
, который обрабатывает результат как беззнаковое 32-битное целое число при обратном преобразовании.
Так:
- право изменения могут быть сделаны, чтобы работать, просто используя
>>>
вместо>>
; a * 128
дает ожидаемый ответ, потому что он никогда не преобразуется в 32-битное целое число со знаком-это просто умножение с плавающей запятой;a << 7
дает неожиданный ответ, потому что он преобразуется в 32-битное целое число со знаком, а затем вы сдвигаете1
в знаковый бит, что приводит к отрицательному 32-битному значению со знаком.
Там нет <<<
, но если вы хотите записать свой левый сдвиг как сдвиг, вы можете использовать
(a << 7) >>> 0
чтобы получить ожидаемый ответ ( >>> 0
эффективно преобразует 32-битное значение со знаком в 32-битное значение без знака).
Поделиться
Matthew Slattery
27 июля 2011 в 19:35
Похожие вопросы:
Побитовые Операции Над Большими Строками В PHP
Вот в чем моя проблема. В настоящее время я пытаюсь реализовать несколько стандартов криптографии в PHP по соображениям совместимости. Тот, над которым я сейчас работаю, — это SHA256 и SHA512. Они…
Побитовые операции и unsigned int в PHP
Я пытаюсь преобразовать свой код C++ в PHP и застрял, мои исходные коды используют целые числа без знака (32 бит) и многие побитовые операции, такие как вращение, xor, сдвиг, я изо всех сил стараюсь…
Как GPUs (Geforce 9800) реализует побитовые целочисленные операции?
CUDA дает программисту возможность написать что-то вроде a & b | ~ c ( a , b , c -это unsigned int с). Что делает GPU внутренне? Это как-то emulate побитовые операции над целыми числами или они…
Операция с большими целыми числами
Я написал простой код C++/CLI для вычисления результата операции с большими целыми числами, но он потерпел неудачу с предупреждением warning C4307: ‘*’ : integral constant overflow , вот мой код:…
Умножение между большими целыми числами и двойными числами
Я управляю некоторыми большими целыми числами (128~256bits) с помощью gmp. Дело дошло до того, что я хотел бы умножить их на двойник, близкий к 1 (0.1 < double < 10), причем результат все еще…
Побитовые операции в Pandas, которые возвращают числа, а не були?
Вопрос Как я могу выполнять побитовые операции в Pandas? Как & работает с целыми числами На целых числах оператор & выполняет побитовую маску >>> mask = 0b1100 # 4 and 8 bits on…
Побитовые операции над знаковыми большими целыми числами
Я пишу простой тип BigInteger в Delphi. Этот тип состоит из массива беззнаковых 32-битных целых чисел (я называю их конечностями), счетчика (или размера) и знакового бита. Значение в массиве…
Что вы можете сделать с целыми числами в GLSL ES?
По-видимому, существует чрезвычайно ограниченное количество вещей, которые вы можете сделать с целыми числами в GLSL ES 2.0. Например: Побитовые операции не поддерживаются. Никакие внутренние…
Логические операции над большими целыми числами в MySQL
Я использую сервер Apache XAMPP. Мне нужно выполнять логические операции с большими целыми числами, что-то вроде 5 (101) & 2 (010) = 0 (000). К сожалению мой большой целых чисел превышает…
axios — как обращаться с большими целыми числами
Вот моя просьба: axios.get(url) .then(res => { console.log(res.data) }) Выход- { value: 156144277082605255 } Но должно быть { value: 156144277082605250 } Как в этом случае поступить с большими…
Что такое побитовые операторы? — CodeRoad
Поскольку никто не поднимал вопрос о том, почему они полезны:
Я часто использую побитовые операции при работе с флагами. Например, если вы хотите передать ряд флагов операции (скажем , File.Open()
, с включенными режимами чтения и записи), вы можете передать их как одно значение. Это достигается путем присвоения каждому возможному флагу своего собственного бита в наборе битов (byte, short, int или long). Например:
Read: 00000001
Write: 00000010
Поэтому, если вы хотите передать read AND write, вы должны передать (READ | WRITE), который затем объединяет их в
00000011
Который затем может быть расшифрован на другом конце, как:
if ((flag & Read) != 0) { //...
который проверяет
00000011 &
00000001
который возвращается
00000001
который не равен 0, поэтому флаг действительно указывает READ.
Вы можете использовать XOR для переключения различных битов. Я использовал это при использовании флага для указания направленных входов (вверх, вниз, влево, вправо). Например, если a sprite движется горизонтально, и я хочу, чтобы он повернулся:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Я просто XOR текущее значение с (LEFT | RIGHT), которое в данном случае выключит LEFT и включит RIGHT.
Сдвиг битов полезен в нескольких случаях.
x << y
это то же самое, что
x * 2 y
если вам нужно быстро умножить на степень два, но следите за смещением 1-го бита в верхний бит — это делает число отрицательным, если оно не является беззнаковым. Это также полезно при работе с различными размерами данных. Например, чтение целого числа из четырех байтов:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Предположим, что A-самый значимый байт, А D-наименьший. Это закончилось бы так:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Цвета часто хранятся таким образом (при этом наиболее значимый байт либо игнорируется, либо используется как Альфа):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Чтобы снова найти значения, просто сдвиньте биты вправо, пока они не окажутся внизу, а затем замаскируйте оставшиеся биты более высокого порядка:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
— это то же самое, что и 11111111
. Так что, по сути, для красного цвета вы бы сделали это:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)
Ядро JavaScript, руководство по использованию
AMP :: JavaScript :: Ядро JavaScript, руководство по использованию
AMP версия сайта
Электронная библиотека
Программисту веб-дизайнеру
Другие материалы
Ядро JavaScript 1.5. Руководство по Использованию
Глава 3
Выражения и Операции
В этой главе рассматриваются выражения и операции JavaScript, в том числе:
операции присвоения, сравнения, арифметические, побитовые, логические строковые и специальные.
Глава состоит из разделов:
Выражения
Выражение это правильный набор литералов,
переменных, операторов и выражений, который вычисляется в одно значение;
это значение может быть числом, строкой или логическим значением.
Концептуально есть выражения двух видов: присваивающие
значение переменной и просто имеющие значение. Например, выражение x = 7
это выражение, в котором x получает значение 7. Это выражение вычисляется в 7.
Такие выражения используют операции присвоения. С другой стороны,
выражение 3 + 4 просто вычисляется в 7; оно не выполняет присвоения
значения. Операции, используемые в таких выражениях, называются просто операциями.
В JavaScript имеются следующие типы выражений:
Операции
В этом разделе рассмотрены операции и содержится
информация о приоритете выполнения операций.
В JavaScript имеются следующие типы операций:
В JavaScript имеются бинарные и унарные
операции. Для выполнения бинарной операции необходимы два операнда: один до знака операции и один — после:
операнд1 операция операнд2
Например, 3+4 или x*y.
Для выполнения унарной операции необходим один операнд, до или после знака операции:
операция операнд
или
операнд операция
Например, x++ или ++x.
Кроме того, в JavaScript есть условная тернарная операция. Она требует наличия трех операндов.
Операции Присвоения
Операция присвоения присваивает левому операнду значение
на базе правого операнда. Базовой операцией присвоения является знак равенства (=),
который присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение y переменной x.
Другие операции присвоения являются сокращенными формами
записи стандартных операций, как показано в таблице.
Таблица 3.1    Операции Присвоения
Сокращенное обозначение —
Значение
x += y — x = x + y
x -= y — x = x — y
x *= y
x = x * y
x /= y
x = x / y
x %= y —
x = x % y
x <<= y
x = x << y
x >>= y — x = x >> y
x >>>= y —
x = x >>> y
x &= y
x = x & y
x ^= y — x = x ^ y
x |= y — x = x | y
Операции Сравнения
Операция сравнения сравнивает операнды и возвращает
логическое значение на базе верности сравнения. Операндами могут быть числа,
строки, логические значения и объекты. Строки сравниваются на базе стандартного
лексикографического порядка с использованием значений Unicode. В таблице даны операции сравнения.
Таблица 3.2 Операции Сравнения
Операция —
Описание —
Примеры, возвращающие true1
Равно (==) —
Возвращает true, если операнды равны. Если операнды разных типов, JavaScript
пытается конвертировать операнды до типа, пригодного для сравнения. —
3 == var1
«3» == var1
3 == ‘3’
Не равно (!=) —
Возвращает true, если операнды не равны. Если операнды разных типов, JavaScript
пытается конвертировать операнды до типа, пригодного для сравнения. —
var1 != 4
var2 != «3»
Строго равно (===) — Возвращает true, если операнды равны и одного типа.
3 === var1
Строго не равно (!==) —
Возвращает true, если операнды не равны и/или не одного типа. —
var1 !== «3»
3 !== ‘3’
Больше (>) — Возвращает true, если левый операнд больше правого.
var2 > var1
Больше или равно (>=) —
Возвращает true, если левый операнд больше правого или равен ему. —
var2 >= var1
var1 >= 3
Меньше (<) —
Возвращает true, если левый операнд меньше правого. — var1 < var2
Меньше или равно (<=) —
Возвращает true, если левый операнд меньше правого или равен ему. —
var1 <= var2
var2 <= 5
1Эти примеры
предполагают, что переменной var1 присвоено значение 3, а переменной var2 значение 4.
Арифметические Операции
Арифметические операции принимают числовые значения (литералы
или переменные) в качестве операндов и возвращают одиночное числовое значение.
Стандартными арифметическими операциями являются сложение (+), вычитание (-),
умножение (*) и деление (/). Эти операции работают так же, как и во многих
других языках программирования, но операция / в JavaScript возвращает результат
деления с плавающей точкой, а не округленное частное, как в языках программирования C или Java. Например:
1/2 //возвращает 0.5 в JavaScript
1/2 //возвращает 0 в Java
Дополнительно JavaScript предоставляет
арифметические операции, перечисленные в следующей таблице:
Таблица 3.3 Арифметические Операции
Операция —
Описание — Пример
%
(Modulus) —
Бинарная операция. Возвращает целочисленный остаток от деления двух операндов. —
12 % 5 возвращает 2.
++
(Инкремент) —
Унарная операция. Добавляет 1 к операнду. Если используется как префикс (++x),
добавляет единицу и возвращает значение операнда; если используется как постфикс (x++),
возвращает значение операнда и затем прибавляет единицу. —
Если x равен 3, то ++x устанавливает x в 4 и возвращает 4; а x++ устанавливает x в 4 и возвращает 3.
—
(Декремент) —
Унарная операция. Вычитает единицу из операнда. Возвращаемое значение аналогично значению
для операции инкремента.
—
Если x равен 3, то —x устанавливает x в 2 и возвращает 2; а x— устанавливает x в 2 и возвращает 3.
—
(Унарное отрицание) —
Унарная операция. Возвращает операнд с измененным знаком. —
Если x равен -3, то -x возвращает 3.
Побитовые Операции
Эти операции рассматривают свои операнды как набор
32-битных двоичных чисел (нулей и единиц), а не как 10-ричные, 16-ричные или
8-ричные числа. Например, 10-ричное число 9 имеет бинарное представление 1001.
Побитовые операции выполняются над такими двоичными представлениями, но
возвращают стандартные числовые значения JavaScript.
В таблице резюмируется информация о побитовых операциях JavaScript. 1001 = 0110)
Побитовые Операции Сдвига
Побитовые операции сдвига принимают два операнда: первый
операнд это сдвигаемое количество, а второй специфицирует количество битовых
позиций, на которое сдвигается первый операнд. Направление сдвига контролируется применяемой операцией.
Операции сдвига конвертируют свои операнды в 32-битные
целые и возвращают результат того же типа, что и у левого операнда.
Операции сдвига перечислены в таблице.
Таблица 3.5 Побитовые Операции Сдвига
Операция — Описание —
Пример
<<
(Сдвиг влево) —
Эта операция сдвигает первый операнд на специфицированное количество битов влево.
Излишние биты, смещенные влево, отбрасываются. Справа биты заполняются нулями. —
9<<2 дает 36, поскольку 1001, смещенное на 2 бита влево, становится 100100, то есть 36.
>>
(Сдвиг вправо с сохранением знака) —
Первый операнд сдвигается на специфицированное количество битов вправо.
Излишние биты, смещенные вправо, отбрасываются. Копии самого левого бита вдвигаются слева. —
9>>2 дает 2, поскольку 1001, смещенное на 2 бита вправо, становится 10, то есть 2.
Аналогично, -9>>2 дает -3, поскольку знак сохраняется.
>>>
(Сдвиг вправо с заполнением нулями) —
Первый операнд сдвигается на специфицированное количество битов вправо.
Излишние биты, смещенные вправо, отбрасываются. Слева биты заполняются нулями.
—
19>>>2 дает 4, поскольку 10011, смещенное на 2 бита вправо, становится 100, то есть
4. Для неотрицательных чисел, сдвиг вправо с заполнением нулями дает тот же эффект, что и сдвиг вправо с сохранением знака.
Логические Операции
Логические операции обычно используются с Boolean (булевыми/логическими)
значениями; в этом случае возвращается Boolean-значение. Однако операции &&
и || реально возвращают значение одного из специфицированных операндов, поэтому,
если эти операции используются с не-Boolean-значениями, они могут вернуть не-Boolean
значение. Логические операции описаны в следующей таблице.
Таблица 3.6 Логические Операции
Операция —
Использование — Описание
&& — expr1 && expr2 —
(Логическое И) Возвращает expr1, если оно может быть конвертировано в false;
иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, &&
возвращает true, если оба операнда true; иначе возвращает false.
|| — expr1 || expr2 —
(Логическое ИЛИ) Возвращает expr1, если оно может быть конвертировано в true;
иначе возвращает expr2. Таким образом, при использовании с Boolean-значениями, ||
возвращает true, если хотя бы один из операндов true; если оба операнда false, возвращает false.
! — !expr
(Логическое НЕ) Возвращает false если ее единственный операнд может быть
конвертирован в true; иначе возвращает true.
Примерами выражений, которые могут быть конвертированы в false
являются такие выражения, которые вычисляются в null, 0, пустую строку («») или undefined.
Вот примеры операции && (логическое И):
a1=true && true // t && t
возвращает true
a2=true && false // t && f
возвращает false
a3=false && true // f && t
возвращает false
a4=false && (3 == 4) // f && f возвращает false
a5=»Cat» && «Dog» // t && t возвращает Dog
a6=false && «Cat» // f && t возвращает false
a7=»Cat» && false // t && f возвращает false
Примеры операции || (логическое ИЛИ):
o1=true || true // t || t возвращает true
o2=false || true // f || t возвращает true
o3=true || false // t || f возвращает true
o4=false || (3 == 4) // f || f возвращает false
o5=»Cat» || «Dog» // t || t возвращает Cat
o6=false || «Cat» // f || t возвращает Cat
o7=»Cat» || false // t || f возвращает Cat
Примеры операции ! (логическое НЕ):
n1=!true // !t
возвращает false
n2=!false // !f
возвращает true
n3=!»Cat» // !t
возвращает false
Сокращенное Вычисление
Так как логические выражения вычисляются слева направо,
они проверяются на возможность выполнения «сокращенного» вычисления по следующим правилам:
Правила логики гарантируют, что эти вычисления всегда
будут корректными. Обратите внимание, что часть что-либо
вышеприведенных выражений не вычисляется, поэтому продолжение выполнения вычисления не даст никакого эффекта.
Строковые Операции
Помимо операций сравнения, может применяться операция
конкатенации/объединения (+) значений двух строк, возвращающее новую строку,
которая является результатом объединения двух строк-операндов. Например, «my » + » string»
возвращает строку «my string».
Сокращенная форма записи операции += также может
использоваться для конкатенации строк. Например, если переменная mystring имеет
значение «alpha,» то выражение mystring += «bet» вычисляется до «alphabet»
и это значение присваивается переменной mystring.
Специальные Операции
В JavaScript имеются следующие специальные операции:
Условная Операция
Условная операция — единственная в JavaScript, принимающая
три операнда. Она может дать одно или другое значение на базе условия. Синтаксис таков:
condition ? val1 : val2
Если condition — true, операция имеет значение val1. Иначе
— значение val2. Вы можете использовать условную операцию в любом месте, где может использоваться стандартная операция.
Например,
status = (age >= 18) ? «adult» : «minor»
Этот оператор присваивает значение «adult» переменной status,
если age равен 19 или более. Иначе переменной status присваивается значение «minor».
Операция «запятая»
Операция «запятая» (,) просто вычисляет оба операнда и
возвращает значение второго операнда. Первоначально использовалась внутри цикла for,
чтобы дать возможность обновлять значения нескольких переменных за один проход цикла.
Например, если имеется 2-мерный массив из 10 элементов по
измерению, следующий код использует операцию «запятая» для инкремента двух
переменных за один проход. Печатаются значения элементов по диагонали массива:
for (var i=0, j=9; i <= 9; i++, j—)
document.writeln(«a[«+i+»,»+j+»]= » + a[i*10 +j])
Заметьте, что двухмерные массивы еще не поддерживаются.
Этот пример эмулирует двухмерный массив, используя одномерный массив.
delete
Операция delete удаляет объект, свойство объекта или
элемент массива по специфицированному индексу. Синтаксис таков:
delete objectName
delete objectName.property
delete objectName[index]
delete property // верно только внутри оператора with
где objectName это имя объекта, property это существующее
свойство, а index это целое число — место элемента в массиве.
Четвертая форма верна только внутри оператора with при удалении свойства объекта.
Можно использовать операцию delete для удаления
переменных, объявленных неявно, но не переменных, объявленных оператором var.
Если операция delete выполнена успешно, она устанавливает
свойство или элемент в undefined. Операция delete возвращает true, если операция
возможна, и false — если операция невозможна.
x=42
var y= 43
myobj=new Number()
myobj.h=4 // создает свойство h
delete x // возвращает true (может
удалить, если х объявлена неявно)
delete y // возвращает false (не может
удалить, если у объявлена через var)
delete Math.PI // возвращает false (не может удалить предопределенное свойство)
delete myobj.h // возвращает true (может удалить свойство, определенное
пользователем)
delete myobj // возвращает true (может удалить, если myobj
объявлен неявно)
Удаление элемента массива
Если Вы удаляете элемент массива, размер массива не изменяется.
Например, если удалить a[3], a[4] все еще остается a[4], а a[3] станет undefined.
Если операция delete удаляет элемент массива, этот элемент
больше не присутствует в массиве. В следующем примере trees[3] удаляется с
помощью delete.
trees=new Array(«redwood»,»bay»,»cedar»,»oak»,»maple»)
delete trees[3]
if (3 in trees) {
// это не будет выполняться
}
Если Вы хотите, чтобы элемент массива существовал, но имел
значение undefined/неопределенное, используйте ключевое слово undefined вместо
операции delete. В следующем примере элементу trees[3] присваивается значение undefined,
но элемент массива продолжает существовать:
trees=new Array(«redwood»,»bay»,»cedar»,»oak»,»maple»)
trees[3]=undefined
if (3 in trees) {
// это будет выполняться
}
in
Операция in возвращает true, если специфицированное
свойство имеется в специфицированном объекте. Синтаксис таков:
propNameOrNumber in objectName
где propNameOrNumber это строка или числовое выражение,
представляющее имя свойства или индекс массива, а objectName это имя объекта.
Некоторые примеры использования операции in:
// Массивы
trees=new Array(«redwood»,»bay»,»cedar»,»oak»,»maple»)
0 in trees // возвращает true
3 in trees // возвращает true
6 in trees // возвращает false
«bay» in trees // возвращает false (Вы обязаны
специфицировать число индекса,
//
а не значение, находящееся по этому индексу)
«length» in trees // возвращает true (length это Array-свойство)
// Предопределенные объекты
«PI» in Math // возвращает true
myString=new String(«coral»)
«length» in myString // возвращает true
// Специальные объекты
mycar = {make:»Honda»,model:»Accord»,year:1998}
«make» in mycar // возвращает true
«model» in mycar // возвращает true
instanceof
Операция instanceof возвращает true, если
специфицированный объект имеет специфицированный тип объекта. Синтаксис:
objectName instanceof objectType
где objectName это имя объекта, сравниваемого с objectType,
а objectType это тип объекта, такой как Date или Array.
Используйте instanceof, если Вам нужно подтвердить тип
объекта на этапе прогона. Например, при отлове исключений Вы можете выполнить
ветвление по разным вариантам кода обработки исключений, в зависимости от типа вызываемого исключения.
Например, следующий код использует instanceof для
определения того, является ли theDay Date-объектом. Поскольку theDay это Date-объект,
операторы в операторе if выполняются.
theDay=new Date(1995, 12, 17)
if (theDay instanceof Date) {
// выполняемые операторы
}
new
Вы можете использовать операцию new для создания
экземпляра объекта пользовательского типа или экземпляра одного из
предопределенных типов объекта: Array, Boolean, Date, Function, Image, Number, Object, Option, RegExp
или String. На сервере Вы можете также использовать ее с DbPool, Lock, File или SendMail.
Используйте new так:
objectName = new objectType ( param1 [,param2] …[,paramN] )
Вы можете также создать объекты, используя инициализаторы
объектов, как описано в «Использовании Инициализаторов Объектов».
См. new в книге
ЯдроJavaScript. Справочник.
this
Ключевое слово this предназначено для обращения к текущему
объекту. В общем, this ссылается на вызывающий объект в методе. Используйте this так:
this[.propertyName]
Пример 1.
Предположим, функция validate проверяет значение свойства объекта и верхнее и нижнее значение:
function validate(obj, lowval, hival) {
if ((obj.value < lowval) || (obj.value > hival))
alert(«Invalid Value!»)
}
Вы можете вызывать validate в обработчике события onChange
в каждом элементе формы, используя this для передачи ему элемента формы, как в этом примере:
<B>Enter a number between 18 and 99:</B>
<INPUT TYPE = «text» NAME = «age» SIZE = 3
onChange=»validate(this, 18, 99)»>
Пример 2.
При соединении со свойством формы, this может ссылаться на родительскую форму
текущего объекта. В следующем примере форма myForm содержит Text-объект и кнопку.
Если пользователь щелкает на кнопке, значением Text-объекта становится имя формы.
Обработчик onClick кнопки использует this.form для обращения к родительской форме myForm.
<FORM NAME=»myForm»>
Form name:<INPUT TYPE=»text» NAME=»text1″ VALUE=»Beluga»>
<P>
<INPUT NAME=»button1″ TYPE=»button» VALUE=»Show Form Name»
onClick=»this.form.text1.value=this.form.name»>
</FORM>
typeof
Операция typeof используется одним из следующих способов:
1. typeof operand
2. typeof (operand)
Операция typeof возвращает строку, указывающую тип
невычисленного операнда.
operand это строка, переменная, ключевое слово или объект, тип которого
возвращается. Скобки не обязательны.
Предположим, Вы определяете следующие переменные:
var myFun = new Function(«5+2»)
var shape=»round»
var size=1
var today=new Date()
Операция typeof возвращает для этих переменных следующие результаты:
typeof myFun is function
typeof shape is string
typeof size is number
typeof today is object
typeof dontExist is undefined
Для ключевых слов true и null операция typeof возвращает
следующие результаты:
typeof true is boolean
typeof null is object
Для числа или строки операция typeof возвращает следующие результаты:
typeof 62 is number
typeof ‘Hello world’ is string
Для значений свойств операция typeof возвращает тип
значения, содержащегося в свойстве:
typeof document.lastModified is string
typeof window.length is number
typeof Math.LN2 is number
Для методов и функций операция typeof возвращает следующие результаты:
typeof blur is function
typeof eval is function
typeof parseInt is function
typeof shape.split is function
Для предопределенных объектов операция typeof возвращает такие результаты:
typeof Date is function
typeof Function is function
typeof Math is function
typeof Option is function
typeof String is function
void
Операция void используется одним из следующих способов:
1. void (expression)
2. void expression
Операция void специфицирует выражение, вычисляемое без
возвращения значения.
expression это вычисляемое выражение JavaScript. Скобки вокруг выражения не
обязательны, но хорошим стилем является их использование.
Можно использовать оператор void для специфицирования
выражения как гипертекстовой ссылки. Выражение вычисляется, но не загружается вместо текущего документа.
Следующий код создает гипертекстовую ссылку, которая
ничего не делает, если пользователь щелкает на ней. Если пользователь щелкает на
ссылке, void(0) вычисляется в undefined, что не вызывает никаких действий в JavaScript.
<A HREF=»javascript:void(0)»>Click here to do nothing</A>
Следующий код создает гиперссылку, которая отправляет
форму, если пользователь щелкает на ссылке.
<A HREF=»javascript:void(document.form.submit())»>
Click here to submit</A>
Приоритет Операций
Приоритет операций определяет порядок выполнения
операций при вычислении выражения. Вы можете переопределить порядок выполнения путем использования скобок.
В таблице описан приоритет операций от низшего к высшему.
побитовое И —
&
равенство —
== != === !==
соотношение —
< <= > >= in instanceof
побитовый сдвиг — << >> >>>
сложение/вычитание — + —
умножение/деление —
* / %
отрицание/инкремент —
! ~ — + ++ — typeof void delete
вызов/создание экземпляра — () new
член — .
[]
Назад Оглавление
Индекс Вперед
AMP версия сайта
Мобильная версия
Сайт для компьютера
http://www.mat.net.ua
Битовые операторы в JavaScript | Различные операторы побитового в JavaScript
Введение в побитовые операторы в JavaScript
Битовые операторы в JavaScript действуют на своих операндов, оперируя ими в форме представления их двоичных чисел (база 2) (в частности, в форме 32-битных чисел), а не в виде их десятичного числа (база 10), восьмеричных чисел (база 8) или шестнадцатеричное число (Base 16). Например, 1010 — это двоичное представление десятичного числа десять. Побитовые операции в JavaScript выполняются над операндами операторов в их двоичных представлениях, но выходные данные всегда возвращаются в стандартной форме числовых значений.
Побитовый оператор в JavaScript преобразует их операнды в форму дополнения 2 их формы 32-разрядного целого числа со знаком. Следовательно, всякий раз, когда оператор обрабатывается над целым числом, производное значение является формой дополнения к этому целому числу. 2-е дополнение к целому числу — это 1-е дополнение к числу (т. Е. По битам, а не к числу) плюс 1.
Например, ниже приведено 32-битное представление числа 7
00000000000000000000000000000111
Ниже 1 ‘дополнение т.е. ~ 7
11111111111111111111111111111000
Ниже приведена форма дополнения 2, которая равна -7
11111111111111111111111111111001
Побитовый оператор | использование | Смысл | |
Побитовое И | х & у | Возвращает 1 в каждой битовой позиции, если оба соответствующих бита равны 1, иначе 0. у | Возвращает 0 в каждой битовой позиции, если оба соответствующих бита равны 1 или 0, в противном случае 1, когда биты различны. |
Побитовое НЕ | ~ х | Перевернет биты операнда x от 1 до 0 и наоборот. | |
Сдвиг влево | х << у | Сдвинет биты влево на двоичном числе x на y бит, при этом нажимая на 0 справа. | |
Знак распространения правого сдвига | х >> у | Сдвинет биты вправо на двоичное число x на y бит, копируя крайние левые биты влево, чтобы завершить 32 бита. | |
Нулевое заполнение вправо сдвиг | х >>> у | Сдвинет биты вправо на двоичное число x на y битов, одновременно нажимая на 0 слева. |
Побитовые логические операторы в JavaScript
Побитовые логические операторы состоят из всех логических операторов, используемых в большинстве языков, но они отличаются друг от друга, так как побитовые логические операторы работают побитово. Следующие битовые логические операторы используются в JavaScript:
1. Побитовое И
Это двоичный оператор, обозначаемый символом амперсанда «&», который выполняет операцию И над последовательной парой соответствующих битов своих аргументов. Оператор «&» вернет 1, только если оба бита 1 будут другими, он вернет 0. Поэтому мы также можем соотнести операцию И с умножением, потому что оба дадут одинаковый ответ.
пример
10 (основание 10) = 00000000000000000000000000001010
13 (база 10) = 00000000000000000000000000001101
—————————-
10 и 13 00000000000000000000000000001000 = 8 (основание 10)
2. Побитовое ИЛИ
Это двоичный оператор, обозначаемый символом вертикальной черты «|», который выполняет операцию ИЛИ на последовательной паре соответствующих битов своих аргументов. Оператор «|» вернет 1, если один из битов равен 1, или оба равны 1, иначе он вернет 0. Битовое ИЛИ «|» отличается от логического ИЛИ «||», так как работает бит за битом. 13 00000000000000000000000000000111 = 7 (основание 10)
4. Побитовое НЕ
Это унарный оператор, обозначаемый символом тильды «~», который выполняет операцию NOT над соответствующими битами своего аргумента. Оператор «~» инвертирует биты операнда, т. Е. Преобразует 0 в 1 или 1 в 0.
пример
10 (основание 10) = 00000000000000000000000000001010
—————————-
~ 10 11111111111111111111111111110101
Битовые операторы сдвига в JavaScript
В режиме побитового сдвига также используются два аргумента, где первый аргумент — это двоичное число, для которого будет выполняться операция сдвига, а второй аргумент указывает количество бит, на которое должен быть сдвинут первый аргумент. Используемый оператор указывает направление операции сдвига в двоичном числе.
1. Битовый сдвиг влево
Это бинарный оператор, обозначаемый символом «<<». Этот оператор сместит крайние правые биты первого аргумента влево на значение времен второго аргумента. Биты, сдвинутые справа, заменяются на 0 в самой правой части для каждой выполненной операции сдвига.
Пример: 8 << 3 дает 64
8 (основание 10) = 00000000000000000000000000001000
—————————-
8 << 3 00000000000000000000000001000000 = 64 (основание 10)
2. Битовый сдвиг вправо
Это бинарный оператор, обозначаемый символом «>>>». Этот оператор сместит крайние правые биты первого аргумента вправо на значение второго аргумента. Биты, сдвинутые слева, заменяются на 0 в самой левой части для каждой выполненной операции сдвига.
Пример: 8 >>> 3 дает 1
8 (основание 10) = 00000000000000000000000000001000
—————————-
8 >>> 3 00000000000000000000000000000001 = 1 (основание 10)
-8 (база 10) = 11111111111111111111111111111000
—————————-
-8 >>> 3 00011111111111111111111111111111 = 536870911 (база 10)
3. Битовый знак, распространяющийся вправо
Это бинарный оператор, обозначаемый символом «>>». Этот оператор сместит крайние правые биты первого аргумента вправо на значение второго аргумента. Биты, сдвинутые слева, заменяются крайним левым битом (т.е. знаковым битом) в самой левой части для каждой выполняемой операции сдвига.
Пример: 8 >>> 3 дает 1
8 (основание 10) = 00000000000000000000000000001000
—————————-
8 >> 3 00000000000000000000000000000001 = 1 (основание 10)
-8 (база 10) = 11111111111111111111111111111000
—————————-
-8 >> 3 11111111111111111111111111111111 = -1 (база 10)
Вывод
Аргументы преобразуются в 32-битные двоичные числа и выражаются в форме битов (т. Е. 0 и 1). Числа в аргументах, приводящих к более чем 32 битам, отбрасывают их старшие биты. То же правило применяется, когда во время операции сдвига, если сдвиг битов влево, дополнительные биты в msb отбрасываются, а во время сдвига вправо отбрасывается дополнительный бит, растущий в самой правой части.
До: 110011010100011101001000100000001110010010001
—————————-
После: 11101001000100000001110010010001
Каждый соответствующий бит соединяется друг с другом, то есть первый бит с первым битом других аргументов, второй бит со вторым битом и так далее.
Оператор применяется в каждом бите (для двоичного оператора это должна быть пара битов), поэтому в JavaScript он называется побитовым оператором.
Практическое применение побитового оператора — битовые флаги, связь через сокет / порты, сжатие, шифрование, конечные автоматы, графика и т. Д.
Рекомендуемые статьи
Это руководство по побитовым операторам в JavaScript. Здесь мы обсудим введение, типы побитовых операторов в JavaScript, такие как логические операторы и операторы сдвига, а также его операции. Вы также можете посмотреть следующие статьи, чтобы узнать больше
- Компиляторы JavaScript
- Обратный в JavaScript
- Для цикла в JavaScript
- Введение в JavaScript
JavaScript | Двоичные побитовые операторы
Двоичные/Бинарные/Binary — это операции, которые принимают 2 числовых элемента на вход и выдают один на выходе., BitwiseANDExpression).
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
1. Вернуть ? EvaluateStringOrNumericBinaryExpression(BitwiseORExpression, |, BitwiseXORExpression).
Информационные ссылки
Стандарт ECMAScript — Раздел «13.12 Binary Bitwise Operators» — https://tc39.es/ecma262/#sec-binary-bitwise-operators
Поделись записью
Побитовые операции — PhpInterview
Побитовые операторы интерпретируют операнды как последовательность из 32 битов (нулей и единиц). Они производят операции, используя двоичное представление числа, и возвращают новую последовательность из 32 бит (число) в качестве результата.
Что такое двоичная система счисления, вам, надеюсь, уже известно. При разборе побитовых операций мы будем обсуждать именно двоичное представление чисел, из 32 бит.
Старший бит слева – это научное название для самого обычного порядка записи цифр (от большего разряда к меньшему). При этом, если больший разряд отсутствует, то соответствующий бит равен нулю.
Примеры представления чисел в двоичной системе:
a = 0; // 00000000000000000000000000000000
a = 1; // 00000000000000000000000000000001
a = 2; // 00000000000000000000000000000010
a = 3; // 00000000000000000000000000000011
a = 255;// 00000000000000000000000011111111
Обратите внимание, каждое число состоит ровно из 32-битов.
Дополнение до двойки – это название способа поддержки отрицательных чисел.
Двоичный вид числа, обратного данному (например, 5 и -5) получается путём обращения всех битов с прибавлением 1.
То есть, нули заменяются на единицы, единицы – на нули и к числу прибавляется 1. Получается внутреннее представление того же числа, но со знаком минус.
Например, вот число 314:
Чтобы получить -314, первый шаг – обратить биты числа: заменить 0 на 1, а 1 на 0:
```11111111111111111111111011000101
Второй шаг – к полученному двоичному числу прибавить единицу, обычным двоичным сложением: 11111111111111111111111011000101 + 1 = 11111111111111111111111011000110.
Итак, мы получили:
-314 = 11111111111111111111111011000110
Принцип дополнения до двойки делит все двоичные представления на два множества: если крайний-левый бит равен 0 – число положительное, если 1 – число отрицательное. Поэтому этот бит называется знаковым битом.
Дополнительно:
Синтаксис распространения (…) — JavaScript
Синтаксис расширения ( ...
) допускает итерацию, такую как массив
выражение или строка, которые должны быть раскрыты в местах, где ноль или более аргументов (для
вызовы функций) или элементы (для литералов массива), либо выражение объекта
быть развернутым в местах, где ноль или более пар ключ-значение (для объектных литералов)
ожидал.
Исходный код этого интерактивного примера хранится в репозитории GitHub.Если вы хотите внести свой вклад в проект интерактивных примеров, клонируйте https://github.com/mdn/interactive-examples и отправьте нам запрос на перенос.
Синтаксис распространения может использоваться, когда необходимо включить все элементы из объекта или массива.
в каком-то списке.
В приведенном выше примере определенная функция принимает значения x
, y
и
z
в качестве аргументов и возвращает сумму этих значений. Значение массива также
определенный.
Когда мы вызываем функцию, мы передаем ей все значения в массиве, используя спред
синтаксис и имя массива — ... номера
.
Если в массиве более трех чисел, например [1, 2, 3, 4]
, тогда это
все равно будет работать нормально, за исключением того, что все четыре будут пройдены, но только первые три
будет использоваться, если вы не добавите в функцию дополнительные аргументы, например:
function sum (x, y, z, n) {
вернуть x + y + z + n;
}
Приведенный выше пример довольно жесткий; реальная ценность синтаксиса распространения в том, что он работает
с одинаковым значением, независимо от того, сколько элементов содержится в объекте, массиве,
и т.п.
Обычно используется, когда вы хотите добавить новый элемент в локальное хранилище данных или отобразить
все хранящиеся предметы плюс новое дополнение. Очень простой вариант такого рода действий
могло бы выглядеть так:
пусть numberStore = [0, 1, 2];
let newNumber = 12;
numberStore = [... numberStore, newNumber];
В приведенном выше примере вы можете повторно запускать последнюю строку столько раз, сколько захотите, чтобы сохранить
добавление дополнительных 12 в конец массива.
Для вызовов функций:
myFunction (...iterableObj);
Для литералов массива или строк:
[... iterableObj, '4', 'пять', 6];
Для объектных литералов (новое в ECMAScript 2018):
пусть objClone = {... obj};
Синтаксис остального выглядит точно так же, как синтаксис распространения. В некотором смысле синтаксис rest противоположен
синтаксис распространения. Синтаксис Spread «расширяет» массив на его элементы, в то время как синтаксис остального
собирает несколько элементов и «уплотняет» их в один элемент.Видеть
остальные параметры.
Разброс в вызовах функций
Заменить apply ()
Обычно используется Function.prototype.apply ()
в тех случаях, когда вы хотите
использовать элементы массива в качестве аргументов функции.
function myFunction (x, y, z) {}
пусть args = [0, 1, 2];
myFunction.apply (нуль, аргументы);
С синтаксисом распространения приведенное выше можно записать как:
function myFunction (x, y, z) {}
пусть args = [0, 1, 2];
myFunction (...args);
Любой аргумент в списке аргументов может использовать синтаксис распространения, и синтаксис распространения может быть
использовался несколько раз.
function myFunction (v, w, x, y, z) {}
пусть args = [0, 1];
myFunction (-1, ... аргументы, 2, ... [3]);
Подать заявку на нового оператора
При вызове конструктора с new
невозможно
напрямую использовать массив и apply ()
( apply ()
выполняет [[Call]]
, а не [[Construct]]
).Однако массив
может быть легко использован с новый
благодаря синтаксису распространения:
пусть dateFields = [1970, 0, 1];
пусть d = новая дата (... dateFields);
Чтобы использовать новый
с массивом параметров без синтаксиса распространения, вы должны
должны сделать это косвенно через частичное применение:
function applyAndNew (конструктор, аргументы) {
function partial () {
return constructor.apply (это, аргументы);
};
если (тип конструктора.prototype === "объект") {
partial.prototype = Object.create (constructor.prototype);
}
возврат частичный;
}
function myConstructor () {
console.log ("arguments.length:" + arguments.length);
console.log (аргументы);
this.prop1 = "val1";
this.prop2 = "val2";
};
let myArguments = ["привет", "как", "есть", "вы", "г-н", ноль];
let myConstructorWithArguments = applyAndNew (myConstructor, myArguments);
console.log (новый myConstructorWithArguments);
Распространение литералов массива
Более мощный литерал массива
Без синтаксиса распространения, чтобы создать новый массив, используя существующий массив как одну из его частей,
синтаксиса литерала массива уже недостаточно, и необходимо использовать императивный код
вместо этого используйте комбинацию push ()
,
splice ()
, concat ()
и т. Д.С синтаксисом распространения это становится более лаконичным:
let parts = ["плечи", "колени"];
let lyrics = ['голова', ... части, 'и', 'пальцы'];
Как и распространение для списков аргументов, ...
можно использовать в любом месте массива.
буквальный, и может использоваться более одного раза.
Копировать массив
пусть arr = [1, 2, 3];
пусть arr2 = [... arr];
arr2.push (4);
Примечание. Синтаксис расширения эффективно расширяется на один уровень при копировании.
массив.Поэтому он может не подходить для копирования многомерных массивов, так как
в следующем примере показано. (То же самое и с Object.assign ()
и синтаксис распространения.)
пусть a = [[1], [2], [3]];
пусть b = [... a];
б. сдвиг (). сдвиг ();
а
Лучший способ объединения массивов
Array.prototype.concat ()
часто используется для объединения массива до конца
существующего массива. Без синтаксиса распространения это делается как:
пусть arr1 = [0, 1, 2];
пусть arr2 = [3, 4, 5];
arr1 = arr1.concat (arr2);
С синтаксисом распространения это становится:
пусть arr1 = [0, 1, 2];
пусть arr2 = [3, 4, 5];
arr1 = [... arr1, ... arr2];
Array.prototype.unshift ()
часто используется для вставки массива значений в
начало существующего массива. Без синтаксиса распространения это делается как:
пусть arr1 = [0, 1, 2];
пусть arr2 = [3, 4, 5];
Array.prototype.unshift.apply (arr1, arr2)
С синтаксисом распространения это становится:
пусть arr1 = [0, 1, 2];
пусть arr2 = [3, 4, 5];
arr1 = [...arr2, ... arr1];
Примечание: В отличие от unshift ()
, это создает новый
arr1
и не изменяет исходный массив arr1
на месте.
Спред в литералах объекта
Остальное / Спред
В свойствах предложения ECMAScript (ES2018) добавлены свойства распространения в
литералы объекта
. Копирует собственные
перечислимые свойства из предоставленного объекта в новый объект.
Поверхностное клонирование (за исключением прототипа) или слияние объектов теперь возможно с использованием
более короткий синтаксис, чем Object.назначить ()
.
let obj1 = {foo: 'bar', x: 42};
пусть obj2 = {foo: 'baz', y: 13};
пусть clonedObj = {... obj1};
let mergedObj = {... obj1, ... obj2};
Обратите внимание, что Object.assign ()
запускает установщиков
, тогда как синтаксис распространения — нет.
Обратите внимание, что вы не можете заменить или имитировать функцию Object.assign ()
:
let obj1 = {foo: 'bar', x: 42};
пусть obj2 = {foo: 'baz', y: 13};
const merge = (...объекты) => ({... объекты});
пусть mergedObj1 = merge (obj1, obj2);
пусть mergedObj2 = merge ({}, obj1, obj2);
В приведенном выше примере синтаксис распространения не работает так, как можно было бы ожидать: он распространяется
массив аргументов в литерал объекта из-за оставшегося параметра.
Только для итераций
Сами объекты не повторяются, но становятся итерируемыми при использовании в массиве, или
с итерационными функциями, такими как map ()
, reduce ()
и
назначить ()
.При объединении 2-х объектов вместе с оператором распространения это
Предполагается, что при слиянии используется другая итерационная функция.
Синтаксис спреда (кроме свойств спреда) может применяться только к повторяющимся
объектов:
let obj = {'ключ1': 'значение1'};
let array = [... obj];
Распространение с множеством значений
При использовании синтаксиса распространения для вызовов функций помните о возможности превышения
ограничение длины аргумента движка JavaScript.См. apply ()
для получения более подробной информации.
Таблицы BCD загружаются только в браузере
Битовые операции JavaScript. Побитовые операторы обрабатывают свои операнды… | by sonia dumitru
Побитовые операторы обрабатывают свои операнды как последовательность из 32 битов (нулей и единиц), а не как десятичные, шестнадцатеричные или восьмеричные числа
.
Например, десятичное число «» имеет двоичное представление
101
. Побитовые операторы выполняют свои операции с такими двоичными представлениями, но возвращают стандартные числовые значения JavaScript.
Побитовые операторы JavaScript:
Примеры:
JavaScript хранит числа как 64-битные числа с плавающей запятой, но все побитовые операции выполняются с 32-битными двоичными числами. Перед выполнением побитовой операции JavaScript преобразует числа в 32-битные целые числа со знаком. После выполнения побитовой операции результат конвертируется обратно в 64-битные числа JavaScript.
В приведенных выше примерах используются 4-битные двоичные числа без знака. Из-за этого ~ 5 возвращает 10 .
Поскольку JavaScript использует 32-битные целые числа со знаком, он не вернет 10. Он вернет -6.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~ 5 = -6)
Целое число со знаком использует крайний левый бит как знак минуса.
Побитовое И
Когда побитовое И выполняется над парой битов, оно возвращает 1, если оба бита равны 1.
Один бит против 4 битов
Побитовое ИЛИ
Когда побитовое ИЛИ выполняется над парой битов, он возвращает 1, если один из битов равен 1:
Один бит против 4 битов
Побитовое исключающее ИЛИ
Когда побитовое исключающее ИЛИ выполняется над парой битов, оно возвращает 1, если биты различны:
Один бит против 4 битов
JavaScript Побитовое И (&)
Побитовое И возвращает 1, только если оба бита равны 1:
Попробуйте сами:
JavaScript Побитовое ИЛИ (|)
Побитовое ИЛИ возвращает 1, если один из битов равен 1:
JavaScript Побитовое исключающее ИЛИ (^)
Побитовое исключающее ИЛИ возвращает 1, если биты различаются:
JavaScript Побитовое НЕ (~)
JavaScript (нулевое заполнение) Побитовый сдвиг влево (
<<)
Это сдвиг влево с заполнением нулями. не существует.y === (x &&! y) || (! x && y)
Второе объяснение: изменение битов числа 1 через число 2.
- И: сохраняет только те биты числа 1, которые установлены в числе 2. Эта операция также называется маскированием, где число2 является маской.
- Или: устанавливает все биты числа 1, которые установлены в числе 2, и сохраняет все остальные биты неизменными.
- Xor: инвертирует все биты числа 1, которые установлены в числе 2, и сохраняет все остальные биты неизменными.
Дополнительная литература
- Целые числа и операторы сдвига в JavaScript
5,8. Побитовые операторы Несмотря В JavaScript 1.0 и JavaScript 1.1 побитовые операторы возвращают Если вы не знакомы с двоичным кодом
Авторские права © 2003 O’Reilly & Associates. Все права защищены. |
JavaScript и бит-хаки 🧙🏻♂️
Побитовые операторы работают с двоичными числами. Если операнды побитового оператора не являются двоичными, то перед операцией они преобразуются в двоичные.
В JavaScript побитовые операторы преобразуют свои операнды в 32-битных целых числа со знаком в формате дополнения до двух .Однако результаты — стандартные числа. В этом посте подробно рассматриваются побитовые операторы, доступные в JavaScript, и исследуются несколько популярных побитовых трюков / приемов.
Прежде чем перейти к побитовым операторам, давайте взглянем на их дополнение.
Есть много способов вычислить дополнение числа до двух. Вот один, который мне нравится использовать:
1. Преобразуйте величину числа в двоичную.
2. Если число положительное, то все готово.
3. Если число отрицательное:
а.Найдите двоичное дополнение до единицы, инвертируя нули и единицы.
б. Добавьте 1 к дополнению до единицы.
Давайте найдем двойное дополнение 5 и -5 с помощью описанного выше метода. Для этого мы будем использовать полубайт (4 бита).
Найти двойное дополнение до 5 несложно. Это положительное число. Таким образом, это дополнение до двух — 0101
.
Нахождение двойного дополнения к -5 включает следующие шаги:
1. Величина -5 равна 5. 5 в двоичной системе равняется «0101».2. -5 - отрицательное число:
1. Дополнение «0101» до единицы - «1010».
2. Дополнение после добавления 1: «1011».
Дополнение -5 до двух: 1011
.
Преобразование дополнения до двух в десятичное число включает аналогичные шаги.
1. Если двойное дополнение числа начинается с «1»:
а. Найдите дополнение до единицы, инвертируя нули и единицы.
б. Добавьте один к своему дополнению.
2. Преобразуйте двоичное число в десятичное.
3. Если дополнение до двух начинается с единицы, добавьте к десятичной дроби знак минус.
Рассмотрим дополнение до двух 0101
и 1011
и найдем их десятичные значения.
0101
начинается с нуля. Никаких дополнительных действий не требуется. Десятичное значение 0101
равно 5.
Преобразование дополнения до десятичной дроби для 1011
требует следующих шагов:
1. Дополнение «1011» до «0100».
2. После добавления 1: `0101`.
3. Десятичный эквивалент «0101» равен 5.4. «1011» начинается с единицы. Следовательно, -5.
Десятичное значение 1011
равно -5.
В формате с дополнением до двух крайний левый бит действует как знаковый бит. Это означает, что n-битная компоновка может безопасно представлять числа от -2 n — 1 до 2 n — 1 — 1 в формате дополнения до двух. Например, полубайт (4-битный макет) может представлять число от -8 до 7 без потери точности.
JavaScript использует 32-битный макет для побитовых операций.Следовательно, диапазон составляет от -2 31 до 2 31 — 1 (эквивалент от -2147483648 до 2147483647 ).
Дополнение до двух 32-битных чисел:
1 => 00000000000000000000000000000001
Дополнение => 11111111111111111111111111111110
+1
-----------------------------------------------
Дополнение до 2 111111111111111111111111111111
-----------------------------------------------
2147483647 => 01111111111111111111111111111111
-----------------------------------------------
Дополнение до 2 011111111111111111111111111111
-----------------------------------------------
2147483648 => 10000000000000000000000000000000
Дополнение => 01111111111111111111111111111111
+1
-----------------------------------------------
Дополнение до 2 10000000000000000000000000000000
-----------------------------------------------
Если число имеет более 32 битов, оно теряет свои значащие биты.Например, следующий оператор записывает ноль.
console.log ((2 ** 32) >> 0);
Это потому, что дополнение 2 до 2 32 равно нулю в 32-битном формате. Мы сдвигаем ноль на нулевые биты и получаем ноль.
4294967296 => 100000000000000000000000000000000 (33 бита)
4294967296 => 00000000000000000000000000000000 (32 бита)
-------------------------------------------------- -----------
Дополнение до 2 => 00000000000000000000000000000000 (32 бита)
-------------------------------------------------- -----------
Побитовые логические операторы
Поразрядные логические операторы соединяют каждый бит одного операнда с другим операндом и выполняют логические операции с этими парами.Вот почему эти операции называются поразрядными операциями .
& (Побитовое И)
Оператор и выполняет операцию И . Возвращает 1, если оба операнда равны 1, иначе 0.
х | y | х и у |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
1 => 00000000000000000000000000000001
2 => 00000000000000000000000000000010
------------------------------------------
1 и 2 => 00000000000000000000000000000000 => 0
------------------------------------------
Для любого числа x, x & 0
всегда дает 0 .
| (Побитовое ИЛИ)
| Оператор выполняет операцию ИЛИ . Возвращает 1, если один из операндов равен 1, иначе 0.
х | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
1 => 00000000000000000000000000000001
2 => 00000000000000000000000000000010
------------------------------------------
1 | 2 => 00000000000000000000000000000011 => 3
------------------------------------------
Для любого числа x, x | 0
всегда дает x .y
1 => 00000000000000000000000000000001
2 => 00000000000000000000000000000010
------------------------------------------
1 ^ 2 => 00000000000000000000000000000011 => 3
------------------------------------------
Для любого числа x x ^ 0
всегда дает x .
~ (Побитовое НЕ)
Оператор
~ выполняет операцию НЕ . Он инвертирует биты операндов.
-1 => 11111111111111111111111111111111
------------------------------------------
~ (-1) => 00000000000000000000000000000000 => 0
------------------------------------------
Для любого числа x, ~ x
всегда дает — (x + 1) .
Операторы побитового сдвига
Операторы побитового сдвига работают с двумя операндами — левым и правым.Оператор сдвигает левый операнд на определенные битовые позиции, определяемые правым операндом. Оператор контролирует направление переключения.
Операторы побитового сдвига преобразуют свой левый и правый операнды в 32-битовые целые числа со знаком в формате дополнения до двух. Используются только младшие 5 бит правого операнда , потому что оператор может сдвинуть 32 бита на макс.
<< (Сдвиг влево)
Как следует из названия, оператор сдвига влево сдвигает первый операнд влево на указанное количество бит.Оператор отбрасывает биты слева и заполняет ноль справа.
2 => 00000000000000000000000000000010
-------------------------------------------------- -
2 << 5 => 00000000000000000000000001000000 => 64
-------------------------------------------------- -
-2147483648 => 10000000000000000000000000000000
-------------------------------------------------- -
-2147483648 << 1 => 00000000000000000000000000000000 => 0
-------------------------------------------------- -
>> (Сдвиг вправо с распространением знака)
Распространяющий знак оператор сдвига вправо сдвигает первый операнд вправо на указанное количество бит.Он отбрасывает биты справа и копирует крайний левый бит слева.
2 => 00000000000000000000000000000010
-------------------------------------------------- -
2 >> 1 => 00000000000000000000000000000001 => 1
-------------------------------------------------- -
-2147483648 => 10000000000000000000000000000000
-------------------------------------------------- -
-2147483648 >> 4 => 11111000000000000000000000000000 => -134217728
-------------------------------------------------- -
>>> (Сдвиг вправо с заполнением нуля)
Оператор сдвига вправо с заполнением нулями очень похож на оператор сдвига вправо с распространением знака.Вместо того, чтобы распространять знаковый бит, он заполняет нулями слева, сдвигая операнд вправо.
В отличие от других побитовых операторов, оператор сдвига вправо с заполнением нулями возвращает 32-битовое целое число без знака. Следовательно, возвращаемое значение преобразуется непосредственно из двоичного в десятичное.
-2147483648 => 10000000000000000000000000000000
-------------------------------------------------- ---
-2147483648 >>> 2 => 00100000000000000000000000000000 => 536870912
-------------------------------------------------- ---
-2147483648 => 10000000000000000000000000000000
-------------------------------------------------- ---
-2147483648 >>> 0 => 10000000000000000000000000000000 => 2147483648
-------------------------------------------------- ---
Битовая маска
Битовая маска или маска — это переменная, которая используется в побитовых операциях для установки / сброса битов другой переменной.Например, предположим, что нам нужно проверить, является ли переменная нечетной. Как его найти с помощью побитовых операторов? Мы знаем, что младший бит нечетного числа всегда равен 1. Приведенная ниже функция использует этот факт.
function isOdd (x) {
вернуть x & 1;
}
console.log (isOdd (5));
console.log (isOdd (4));
Функция isOdd
сбрасывает биты x
с помощью AND x
с 1.
5 => 0000000000000000000000000000101
1 => 0000000000000000000000000000001
---------------------------------------
& => 0000000000000000000000000000001 => 1
---------------------------------------
4 => 0000000000000000000000000000100
1 => 0000000000000000000000000000001
---------------------------------------
& => 0000000000000000000000000000000 => 0
---------------------------------------
Здесь мы можем сказать, что 1
действует как маска / битовая маска.Следовательно, isOdd
можно записать как
function isOdd (x) {
const mask = 1;
вернуть х & маску;
}
console.log (isOdd (5));
console.log (isOdd (4));
Подробнее о битовой маске можно прочитать здесь.
Уловки
Побитовые трюки похожи на темную магию компьютерного программирования 🔮. Они менее интуитивны и трудны для понимания. Это потому, что они работают с двоичным кодом, а двоичный код создан для машин, а не для людей. Я постараюсь объяснить каждый трюк как можно проще.Не стесняйтесь исправлять / добавлять, если есть какие-либо пробелы.
⚠️ Приведенные ниже приемы показаны только в учебных целях. Их следует тщательно проверить, прежде чем использовать в проекте. Кроме того, эти уловки могут иметь целочисленное переполнение, если требуется более 32 бит.
Усечь целое число
function truncate (x) {
return ~~ x;
}
усечь (-1234,12);
усечь (1234,12);
Приведенный выше метод усекает целую часть числа.Он использует тот факт, что JavaScript преобразует операнды побитового оператора в 32-битовые целые числа со знаком в формате дополнения до двух.
Возможно, вы захотите использовать в своем проекте Math.trunc ().
Перевернуть знак целого числа
Для любого целого числа x , ~ x
дает - (x + 1)
. Следовательно,
~ x + 1 => - (x + 1) + 1 => -x - 1 + 1 => -x
function negate (x) {
return ~ x + 1;
}
Увеличение / уменьшение на 1
function add1 (x) {
возврат - ~ x;
}
функция subtract1 (x) {
return ~ -x;
}
Обмен значениями
Значения двух переменных можно поменять местами с помощью оператора XOR.= y;
}
Сила двух
Если x — степень двойки, то для x — 1 будут включены только самые правые биты. Следовательно, операция И x с x — 1 даст ноль, если x является степенью 2. Например,
4 => 00000000000000000000000000000100
4-1 => 00000000000000000000000000000011 => 3
--------------------------------------------
& => 00000000000000000000000000000000 => 0
--------------------------------------------
function isPowerOf2 (x) {
if (x === 0) {
вернуть ложь;
}
return (x & (x - 1)) === 0;
}
isPowerOf2 (2);
isPowerOf2 (3);
Абсолютное значение
Давайте найдем абсолютное значение -5 без разветвления .Как мы знаем, для любых x ~ x
дает - (x + 1)
. Таким образом, мы можем сделать ~ (-5) + 1
, чтобы получить 5.
-5 => 11111111111111111111111111111011
~ (-5) => 00000000000000000000000000000100
+1
-----------------------------------------
00000000000000000000000000000101 => 5
-----------------------------------------
Нам нужно отрицать число и прибавлять 1 только тогда, когда число отрицательное.Мы можем использовать следующий алгоритм:
- Создайте битовую маску для числа x на
x >> 31
. Битовая маска будет равна нулю для положительных x и -1 для отрицательных x .
5 >> 31 => 00000000000000000000000000000000 => 0
-5 >> 31 => 11111111111111111111111111111111 => -1
- XOR битовая маска с x для поиска отрицания.y) & маска);
}Альтернативный метод. Он использует оператор сдвига вправо и разницу в числах.
function min (x, y) { const mask = (x - y) >> 31; вернуть y + ((x - y) & маска); } function max (x, y) { const mask = (x - y) >> 31; вернуть x - ((x - y) & маска); }
Вы можете использовать в своем проекте Math.min () и Math.max ().
Обратные биты целого числа без подписи
function reverseBits (number) { const size = 31; пусть результат = 0; для (пусть я = 1; я <= 31; я + = 1) { результат | = число & 1; число >> = i; результат << = 1; } вернуть результат; } приставка.журнал (reverseBits (1));
Значения RGB из цветового кода
function hexToRgb (color) { const r = (цвет & 0xff0000) >>> 16; const g = (цвет & 0x00ff00) >>> 8; const b = цвет & 0x0000ff; return [r, g, b] .join (','); } console.log (hexToRgb (0x010203));
Последние мысли:
В языке высокого уровня, таком как JavaScript, побитовые операторы относительно медленны. Основная причина медлительности - преобразование операндов в дополнение до двух.Кроме того, побитовые операторы снижают разборчивость кода. Их меньшая интуитивность создает умственные издержки при преобразовании десятичных чисел в двоичные и наоборот. Их следует использовать экономно.
Сказав это, если ситуация потребует, не стесняйтесь встряхнуть несколько бит!
Побитовые операции в Javascript - ncona.com - Изучение компьютеров
В последнее время я выполнял несколько упражнений на алгоритмы, связанные с двоичными числами. Поскольку мой язык для решения проблем с алгоритмами - это JavaScript, и в прошлом я немного читал о том, как работают числа в JavaScript, я был очень сбит с толку, узнав, что двоичные операции действительно работают, поскольку числа JavaScript представлены в виде дробно-экспоненциальной нотации.
Быстрый поиск дал мне ответ на этот вопрос. Когда вы выполняете двоичные операции с числом, оно будет преобразовано в целое число с дополнением до двух. Еще одна интересная вещь заключается в том, что даже несмотря на то, что числа JavaScript построены с использованием 64 бит, они будут преобразованы в 32 бит при выполнении бинарных операций. Давайте посмотрим, как эти два фактора влияют на нашу деятельность.
32 бита
Чтобы упростить этот пример, предположим, что мы говорим о числах без знака. Если у нас 32 бита, наибольшее число, которое мы можем представить, будет: 4 294 967 295.Если мы добавим к этому числу единицу, произойдет целочисленное переполнение, и все биты будут преобразованы в 0. Давай попробуем:
1 2
> 4294967295 + 1 4294967296
Мы видим, что переполнения не произошло. Это связано с тем, что мы используем оператор + для сложения двух 64-битных чисел JavaScript. Представление этого числа возможно с использованием 64 бит, но не с использованием 32 бит.Давайте теперь возьмем это 64-битное число и попробуем выполнить с ним бинарную операцию:
Результат на этот раз неверный. Правильный ответ должен быть 4 294 967 297, так как мы в основном устанавливаем последний бит, который был от 0 до 1. Причина, по которой данный ответ - 1, заключается в том, что число слишком велико для представления 32 битами, а после его усечения оно выглядит как а 0:
Дополнение до двух
В моем предыдущем объяснении я немного упростил концепцию, предположив, что мы используем целые числа без знака.Дело в том, что число преобразуется в представление с дополнением до двух, что позволяет нам иметь как положительные, так и отрицательные числа.
Чтобы упростить объяснение, предположим, что у нас есть числовой тип, использующий 8 бит. Если бы это было беззнаковое число, мы могли бы представлять числа от 0 до 255 (от 00000000 до 11111111). Используются все возможные комбинации и нет места для беззнаковых чисел. Если вы добавите 1 к наибольшему числу, произойдет переполнение, и результат станет 0.
Допустим, мы действительно хотим иметь возможность представлять целые числа со знаком с помощью нашего числового типа. Один из простых способов сделать это - использовать дополнение до двух. Есть конечно недостаток. У нас все еще есть только 8 бит, поэтому нам придется пожертвовать местом для представления отрицательных чисел. Используя дополнение до двух, мы можем представить число 0 (00000000) и положительные числа от 1 до 127 (от 00000001 до 01111111) и от -1 до -128 (от 11111111 до 1000000).
Положительные числа очень просты.Самый старший бит будет установлен в 0, а все остальные биты представляют число так же, как двоичное число без знака. Отрицательные числа требуют немного большего объяснения, но также очень просты для понимания. Интересно то, что за наибольшим числом (01111111) следует наименьшее возможное число (10000000). Это может показаться запутанным, но на самом деле это не так уж сложно.
Вы можете преобразовать положительное число в отрицательное, взяв дополнение до единицы (т.е.е. Выполнение двоичной операции not с числом), а затем прибавление 1. Давайте попробуем это с максимально возможным числом 127.
1 2 3 4
127 -> 01111111 ~ 127 -> 10000000 ~ 127 + 1 -> 10000001 -127 -> 10000001
Теперь посмотрим, как это работает с числом 1:
.
1 2 3 4
1 -> 00000001 ~ 1 -> 11111110 ~ 1 + 1 -> 11111111 -1 -> 11111111
Как вы можете видеть отсюда, с этой нотацией выполнять двоичные операции довольно просто:
1 2 3 4 5
10000001 - 00000001 = 10000000 -127-1 = -128 11111111 + 00000001 = 00000000 -1 + 1 = 0
Теперь, когда мы понимаем, как работает дополнение до двух, и знаем, что JavaScript выполняет двоичные операции, используя 32 бита, стало яснее, что происходит с нашими числами.
Программное обеспечение подготовки к собеседованию стало проще. Вопросы для собеседования по кодированию.
АЛГОДИЧНО
Упражняться
Случайная проблема
Все вызовыБазовые массивы
Деревья двоичного поиска
Динамическое программирование
Легкие струны
Внешний интерфейс
Графики
Жесткие массивы
Жесткие струны
Хеш-карты
Связанные списки
Средние массивы
Очереди
Рекурсия
Сортировка
Стеки
Системный дизайн
ДеревьяУчиться
Все уроки и руководства
Памятка по структурам данных
Бесплатные видео по программированию
Вопросы на собеседовании по битовой манипуляции
Вопросы на собеседовании по Javascript
Вопросы на собеседовании по Python
Вопросы для собеседования по Java
Вопросы на собеседовании по SQL
Вопросы о контроле качества и тестировании на собеседовании
Вопросы на собеседовании по Data Engineering
Вопросы на собеседовании по Data Science
Вопросы на собеседовании по блокчейнуГорячие темы
Обновление ускоренного курса: день 4
Как работают поисковые системы?
Что такое структура данных связанного списка?
Решение проблем с рекурсией vs.Итерация
Стоит ли мне присоединиться к этой компании: оценка финансового здоровьяКарьера
Каталог компаний
Программное обеспечениеТрендовые компании
Полоса
Google
LinkedIn
Палантир
Yelp- Логин участника
- Купить курс скидка 40%
- Отзывы
Компания
Узнать о нас
Связаться с нами
Политика конфиденциальности
Условия и положения
Блог
.