Skip to content

位运算符实例

取整

使用 ~>><<>>>| 来取整。

js
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

值交换

使用按位异或 ^ 来完成值交换

js
var a = 5;var b = 8;
a ^= b;b ^= a;a ^= b;
console.log(a); // 8console.log(b); // 5

异或还经常被用于加密。

十进制转二进制

js
var number = 3;var result = number.toString(2);
var result2 = (14).toString(2);// "1110"

颜色值转换

使用 &>>| 来完成 RGB 值和 16 进制颜色值之间的转换

js
/** * 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'

判断正负

js
function isPos(n) {
  return n === n >>> 0 ? true : false;
}
isPos(-1); // false
isPos(1); // true

判断符号是否相同

通常, 比较两个数是否符号相同, 我们使用 x * y > 0 来判断即可. 但如果利用按位异或 ^, 运算速度将更快。

js
console.log(-17 ^ (9 > 0));
// false

判断奇偶

使用 & 运算符判断一个数的奇偶

如果把 n 以二进制的形式展示的话,其实我们只需要判断最后一个二进制位是 1 还是 0 就行了。

js
// 偶数 & 1 = 0
// 奇数 & 1 = 1
console.log(2 & 1); // 0
console.log(3 & 1); // 1

判断索引是否存在

这是一个很常用的技巧,如判断一个数是否在数组里面:

js
// 如果url含有 ? 号,则后面拼上&符号,否则加上?号
url += ~url.indexOf('?') ? '&' : '?';

因为:~-1 === 0

-1 在内存的表示的二进制符号全为 1,按位非之后就变成了 0. 进一步说明——1 在内存的表示为:0000...0001,第一位 0 表示符号位为正,如果是 -1 的话符号位为负用 1 表示 1000...0001,这个是 -1 的原码,然后符号位不动,其余位取反变成 1111...1110,这个就是 -1 的反码表示,反码再加 1 就变成了 1111...1111,这个就是 -1 的补码,负数在内存里面(机器数)使用补码表示,正数是用原码。所以全部都是 1 的机器数按位非之后就变成了全为 0。剩下的其它所有数按位非都不为 0,所以利用这个特性可以用来做 indexOf 的判断,这样代码看起来更简洁一点。

来源:https://tsejx.github.io/javascript-guidebook/basic-concept/expressions/operators/bitwise-operators/

基于 MIT 许可发布