- все
JavaScript
Числа хранятся в виде 64 (8-битных) чисел с плавающей запятой с корнем из 10.JavaScrip
t не является типизированным языком. В отличие от многих других языков программирования,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 = 0
// 奇数 & 1 = 1
console.log(2 & 1) // 0
console.log(3 & 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
- использовать
^
завершить обмен ценностями
var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a) // 8
console.log(b) // 5
- использовать
&, >>, |
Чтобы завершить преобразование между значениями 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'
Ссылаться на
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
- http://javascript.ruanyifeng.com/grammar/operator.html
- http://www.w3school.com.cn/js/js_obj_number.asp