Синтаксис JavaScript Справочник JavaScript JSON Коды клавиш События Строгий режим

Побитовые операторы JavaScript

Побитовые операторы требуют в качестве операндов 32-ух разрядные целые числа, поэтому значения преобразуются из 64-разрядных чисел в 32-разрядные, затем для них выполняется нужная операция, а полученный результат преобразуется обратно в 64-разрядный формат.

Все побитовые операторы преобразуют операнды по тем же правилам, что и функция Number(). Специальные значения NaN и Infinity в поразрядных операциях интерпретируются как 0.

Представление 32 битного целого числа со знаком

В целых числах со знаком все биты, кроме 32-го, представляют само значение, тогда как 32-й бит определяет знак числа: 0 для неотрицательных чисел и 1 для отрицательных. Так как 32-й бит определяет знак числа, его называют знаковым (sign bit). Целые неотрицательные числа хранятся в настоящем двоичном формате. Например, число 18 представляется как 00000000000000000000000000010010, или, сокращённо, как 10010. Эти пять битов и являются фактическим значением числа.

Отрицательные числа также хранятся в двоичном коде, но в формате, который называется дополнительным кодом. Дополнительный код вычисляется в три этапа:

  1. Определяется двоичное представление абсолютного значения числа. Например, для числа -18 сначала определяется двоичное представление числа 18 (это абсолютное значение числа -18).
  2. Находится обратный код числа. Это означает, что каждый нуль заменяется единицей и наоборот.
  3. К полученному результату прибавляется единица.

К примеру, определим двоичное представление числа -18. Начнём с двоичного представления его абсолютного значения (18):

0000 0000 0000 0000 0000 0000 0001 0010

Далее определяем обратный код:

1111 1111 1111 1111 1111 1111 1110 1101

И прибавляем единицу к обратному двоичному коду числа:

Таким образом, двоичным эквивалентом -18 является 11111111111111111111111111101110. Однако в JavaScript такое двоичное представление чисел скрыто, поэтому, при выводе отрицательного числа в двоичном представлении вы получите двоичный код его абсолютного значения со знаком минус:

var num = -18;
alert(num.toString(2));   // "-10010"

Побитовое И (&)

Оператор Тип оператора А О Типы значений
… & … Побитовое И слева направо 2 целое, целое → целое

Оператор & (побитовое И) выполняет операцию И для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции И:

Бит первого числа Бит второго числа Результат
0 0 0
0 1 0
1 0 0
1 1 1

В следующем примере операция И выполняется для чисел 14 и 9:

/*
     9 = 00000000000000000000000000001001
    14 = 00000000000000000000000000001110
         --------------------------------
14 & 9 = 00000000000000000000000000001000 = 8
*/

var result = 14 & 9;
alert(result);     // 8

Побитовое ИЛИ (|)

Оператор Тип оператора А О Типы значений
… | … Побитовое ИЛИ слева направо 2 целое, целое → целое

Оператор | (побитовое ИЛИ) выполняет операцию ИЛИ для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции ИЛИ:

Бит первого числа Бит второго числа Результат
0 0 0
0 1 1
1 0 1
1 1 1

В следующем примере операция ИЛИ выполняется для чисел 14 и 9:

/*
     9 = 00000000000000000000000000001001
    14 = 00000000000000000000000000001110
         --------------------------------
14 | 9 = 00000000000000000000000000001111 = 15
*/

var result = 14 | 9;
alert(result);     // 15

Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (^)

Оператор Тип оператора А О Типы значений
… ^ … Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ слева направо 2 целое, целое → целое

Оператор ^ (побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию ИСКЛЮЧАЮЩЕЕ ИЛИ для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции ИСКЛЮЧАЮЩЕЕ ИЛИ:

Бит первого числа Бит второго числа Результат
0 0 0
0 1 1
1 0 1
1 1 0

В следующем примере операция ИСКЛЮЧАЮЩЕЕ ИЛИ выполняется для чисел 14 и 9:

/*
     9 = 00000000000000000000000000001001
    14 = 00000000000000000000000000001110
         --------------------------------
14 ^ 9 = 00000000000000000000000000000111 = 7
*/

var result = 14 ^ 9;
alert(result);     // 7

Побитовое НЕ (~)

Оператор Тип оператора А О Типы значений
~ … Побитовое НЕ (инверсия) справа налево 1 целое → целое

Оператор ~ (побитовое НЕ) выполняет операцию НЕ (инверсию) для каждого бита числа. Ниже приведена таблица истинности для операции НЕ:

Бит числа Результат
0 1
1 0

В следующем примере операция НЕ выполняется для числа 9:

/*
 9 = 00000000000000000000000000001001
     --------------------------------
~9 = 11111111111111111111111111110110 = -10
*/

var num = ~9;
alert(num);   // -10

Сдвиг битов влево (<<)

Оператор Тип оператора А О Типы значений
… << … Сдвиг битов влево слева направо 2 целое, целое → целое

Оператор << (сдвиг битов влево) сдвигает все биты числа влево на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов влево будут сдвинуты биты числа. При сдвиге битов влево освободившиеся разряды справа заполняются нулями.

В следующем примере сдвиг битов влево выполняется для числа 9:

/*
     9 = 00000000000000000000000000001001
         --------------------------------
9 << 2 = 00000000000000000000000000100100 = 36
*/

var result = 9 << 2;
alert(result);   // 36

Сдвиг битов вправо с сохранением знака (>>)

Оператор Тип оператора А О Типы значений
… >> … Сдвиг битов вправо с сохранением знака слева направо 2 целое, целое → целое

Оператор >> (сдвиг битов вправо с сохранением знака) сдвигает все биты числа (кроме знакового) вправо на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов вправо будут сдвинуты биты числа. При сдвиге битов вправо в освободившиеся разряды (после знакового бита) копируется знаковый бит.

В следующем примере сдвиг битов вправо выполняется для чисел 9 и -9:

/*
     9 = 00000000000000000000000000001001
         --------------------------------
9 >> 2 = 00000000000000000000000000000010 = 2


     -9 = 11111111111111111111111111110111
          --------------------------------
-9 >> 2 = 11111111111111111111111111111101 = -3
*/

var result1 = 9 >> 2;
var result2 = -9 >> 2;

alert(result1);   // 2
alert(result2);   // -3

Сдвиг битов вправо с заполнением нулями (>>>)

Оператор Тип оператора А О Типы значений
… >>> … Сдвиг битов вправо с заполнением нулями слева направо 2 целое, целое → целое

Оператор >>> (сдвиг битов вправо с заполнением нулями) сдвигает все биты числа вправо на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов вправо будут сдвинуты биты числа. При сдвиге битов вправо освободившиеся разряды слева заполняются нулями.

В следующем примере сдвиг битов вправо выполняется для чисел 9 и -9:

/*
      9 = 00000000000000000000000000001001
          --------------------------------
9 >>> 2 = 00000000000000000000000000000010 = 2


      -9 = 11111111111111111111111111110111
           --------------------------------
-9 >>> 2 = 00111111111111111111111111111101 = 1073741821
*/

var result1 = 9 >>> 2;
var result2 = -9 >>> 2;

alert(result1);   // 2
alert(result2);   // 1 073 741 821
Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011-2018 © puzzleweb.ru

Реклама на сайте | puzinfo@puzzleweb.ru