Skip to content

位运算符的应用

交换两个变量的值

js
var a = 10;
var b = 99;
// 异或
a ^= b;
b ^= a;
a ^= b;

RGB to HEX

js
var color = {r: 5, g: 218, b: 85};

// (1 << 24)的作用为保证结果是6位数
var rgb2hex = function(r, g, b) {
  return '#' + ((1 << 24) + (r << 16) + (g << 8) + b)
  .toString(16) // 先转成十六进制,然后返回字符串
  .substring(1);   // 去除字符串的最高位,返回后面六个字符串
};

console.log(rgb2hex(color.r, color.g, color.b))
// "#bada55"

开关

引用自阮一峰大神的教程

假定某个对象有四个开关,每个开关都是一个变量。那么,可以设置一个四位的二进制数,它的每个位对应一个开关。

js
var FLAG_A = 1; // 0001
var FLAG_B = 2; // 0010
var FLAG_C = 4; // 0100
var FLAG_D = 8; // 1000

然后,就可以用二进制运算,检查当前设置是否打开了指定开关。

js
var flags = 5; // 二进制的0101

if (flags & FLAG_C) {
  // ...
}
// 0101 & 0100 => 0100 => true

现在假设需要打开A、B、D三个开关,我们可以通过二进制运算构造一个掩码变量。

js
var mask = FLAG_A | FLAG_B | FLAG_D;
// 0001 | 0010 | 1000 => 1011

有了掩码,二进制或运算可以确保打开指定的开关。

js
flags = flags | mask;

上面代码中,计算后得到的flags变量,代表三个开关的二进制位都打开了。

二进制运算可以将当前设置中凡是与开关设置不一样的项,全部关闭。

js
flags = flags & mask;

异或运算可以切换(toggle)当前设置,即第一次执行可以得到当前设置的相反值,再执行一次又得到原来的值。

js
var mask = 15 // 1111
flags = flags ^ mask;

二进制否运算可以翻转当前设置,即原设置为0,运算后变为1;原设置为1,运算后变为0。

js
flags = ~flags;
  • 任何数和 0 异或得到原来值
  • 任何数和 111...111 异或可以按位取反

Powered by VitePress