位与(x&y):对操作数进行二进制与的操作,如果两个操作数的某一位两个都为1,将对应的结果位设为1。
0x0007 & 0x0003 = 0x0003
\
一个小型年老棕色的狗:64 + 16 + 8 + 2 = 90
搜索一个有特定标记的宠物,只需要和搜索值进行位与操作。
//搜索大型 年轻 白色的宠物
var searchFlags = 128 + 32 + 4;
var pets = []; //宠物
var numPets = pets.length;
for(var i = 0; i < numPets; i++){
if(searchFlags & pets[i].flags === searchFlags){ }
}
位或(x|y):对操作数进行二进制或的操作,如果两个操作数的某一位只要有一个为1,将对应的结果位设为1。
0x0007 | 0x0003 = 0x0007
位异或(x^y):对操作数进行二进制异或的操作,如果两个操作数的某一位只有一个为1,将对应的结果位设为1。
0x0001 ^ 0x0000 = 0x0001 0x0001 ^ 0x0001 = 0x0000
//toggle在0和1之间转换(假设开始toggle等于0或者1)
toggle ^= 1;
toggle = toggle ? 0 : 1;
位非(~x):对所有位进行取反(如果操作数是有符号整数(最左位为符号位),则~操作符等于取负减1)。
11100111 取反为 00011000
位左移(x<<numBits):对x的二进制向左移numBits位。所有位向左移,最左位丢失,0填补最右的位。等价于无符号整数的乘法 x*(2^numBits)
y = 5 << 1; // y=10; => Math.floor(5*(2^1))
y = 5 << 2; // y=20; => Math.floor(5*(2^2))
y = 5 << 3; // y=40; => Math.floor(5*(2^3))
算术位左移(x>>numBits):对x的二进制向右移numBits位。除了最左符号位,所有位向右移,最右位丢失。等价于有符号整数的除法 x/(2^numBits)
y = 5 >> 1; // y=5; => Math.floor(5/(2^1))
y = 5 >> 2; // y=2; => Math.floor(5/(2^2))
y = 5 >> 3; // y=1; => Math.floor(5/(2^3)) x = y >> 0; //是一个快速的 x = Math.floor(y)