Волшебное использование побитовых операторов в JS

внешний интерфейс программист JavaScript Язык программирования
  • всеJavaScriptЧисла хранятся в виде 64 (8-битных) чисел с плавающей запятой с корнем из 10.JavaScript не является типизированным языком. В отличие от многих других языков программирования,JavaScriptРазличные типы номеров, таких как целое число, короткие, длинные, поплавные и т. Д., Не определены.
  • Целочисленная точность (без десятичной точки или экспоненциального представления) составляет до 15 цифр. Максимальное количество цифр десятичной точности равно 17, но арифметика с плавающей запятой не всегда точна на 100%.
  • Битовая операция напрямую вычисляет двоичные биты, а битовая операция непосредственно обрабатывает каждый бит.Это очень низкоуровневая операция.Преимущество в том, что она очень быстрая.
  • Битовые операции работают только с целыми числами.Если операнд не является целым числом, он будет автоматически преобразован в целое число перед запуском.
  • существуетJavaScriptВнутренне значения хранятся в виде 64-битных чисел с плавающей запятой, но при выполнении битовых операций они оперируют 32-битными целыми числами со знаком, и возвращаемое значение также является 32-битным целым числом со знаком.

7 побитовых операторов, часто используемых в JS

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

&Комбинирование и обработка соответствующих битов в двоичном числе определенным образом, если все соответствующие биты равны 1, результат равен 1, а если какой-либо один бит равен 0, результат равен 0.

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// 3的二进制表示为: 00000000 00000000 00000000 00000011
// -----------------------------
// 1的二进制表示为: 00000000 00000000 00000000 00000001
console.log(1 & 3)     // 1

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

|оператор, за которым следует&Разница в том, что результат равен 1, если любой из операндов в соответствующем бите равен 1.

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// 3的二进制表示为: 00000000 00000000 00000000 00000011
// -----------------------------
// 3的二进制表示为: 00000000 00000000 00000000 00000011
console.log(1 | 3)     // 3

3. Побитовое исключающее или (XOR)^

^Если двум операндам соответствует только одна единица, результат равен 1, а остальные равны 0.

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// 3的二进制表示为: 00000000 00000000 00000000 00000011
// -----------------------------
// 2的二进制表示为: 00000000 00000000 00000000 00000010
console.log(1 ^ 3)     // 2

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

~Оператор должен инвертировать бит, 1 становится 0, 0 становится 1, то есть дополнением двоичного числа.

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// 3的二进制表示为: 00000000 00000000 00000000 00000011
// -----------------------------
// 1反码二进制表示: 11111111 11111111 11111111 11111110
// 由于第一位(符号位)是1,所以这个数是一个负数。JavaScript 内部采用补码形式表示负数,即需要将这个数减去1,再取一次反,然后加上负号,才能得到这个负数对应的10进制值。
// -----------------------------
// 1的反码减1:     11111111 11111111 11111111 11111101
// 反码取反:       00000000 00000000 00000000 00000010
// 表示为10进制加负号:-2
console.log(~ 1)     // -2
  • Простая память: сложение числа и его отрицание равно -1.

5. Левый сдвиг<<

<<Оператор сдвигает все биты двоичного числа заданного значения влево заданное число раз, правила перемещения следующие:Отбросить высокий, низкий 补 0То есть сдвинуть все числа влево на соответствующее количество битов в двоичном виде, удалить старшие биты (отбросить), а пустые биты младших битов заполнить нулями.

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// -----------------------------
// 2的二进制表示为: 00000000 00000000 00000000 00000010
console.log(1 << 1)     // 2

6. Подписанный правый сдвиг>>

>>Этот оператор сдвигает биты указанного операнда вправо на указанное количество битов.Биты, сдвинутые вправо, отбрасываются, а самый левый бит копируется, чтобы заполнить левый бит.. Поскольку новый крайний левый бит всегда такой же, как и раньше, бит знака не изменяется. Поэтому это называется «символическое распространение».

// 1的二进制表示为: 00000000 00000000 00000000 00000001
// -----------------------------
// 0的二进制表示为: 00000000 00000000 00000000 00000000
console.log(1 >> 1)     // 0

7. Беззнаковый сдвиг вправо>>>

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

Для неотрицательных чисел сдвиг вправо со знаком и сдвиг вправо без знака всегда возвращают один и тот же результат. Например,9 >>> 2получать2 和 9 >> 2такой же.

Волшебное использование побитовых операторов в js

  1. Используйте оператор & для проверки четности числа
// 偶数 & 1 = 0
// 奇数 & 1 = 1
console.log(2 & 1)    // 0
console.log(3 & 1)    // 1
  1. использовать~, >>, <<, >>>, |округлить
console.log(~~ 6.83)    // 6
console.log(6.83 >> 0)  // 6
console.log(6.83 << 0)  // 6
console.log(6.83 | 0)   // 6
// >>>不可对负数取整
console.log(6.83 >>> 0)   // 6
  1. использовать^завершить обмен ценностями
var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)   // 8
console.log(b)   // 5
  1. использовать&, >>, |Чтобы завершить преобразование между значениями RGB и шестнадцатеричными значениями цвета
/**
 * 16进制颜色值转RGB
 * @param  {String} hex 16进制颜色字符串
 * @return {String}     RGB颜色字符串
 */
  function hexToRGB(hex) {
    var hexx = hex.replace('#', '0x')
    var r = hexx >> 16
    var g = hexx >> 8 & 0xff
    var b = hexx & 0xff
    return `rgb(${r}, ${g}, ${b})`
}

/**
 * RGB颜色转16进制颜色
 * @param  {String} rgb RGB进制颜色字符串
 * @return {String}     16进制颜色字符串
 */
function RGBToHex(rgb) {
    var rgbArr = rgb.split(/[^\d]+/)
    var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
    return '#'+ color.toString(16)
}
// -------------------------------------------------
hexToRGB('#ffffff')               // 'rgb(255,255,255)'
RGBToHex('rgb(255,255,255)')      // '#ffffff'

Ссылаться на

  1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
  2. http://javascript.ruanyifeng.com/grammar/operator.html
  3. http://www.w3school.com.cn/js/js_obj_number.asp