没有按位计算的思维的程序员,不是一个合格的程序员。所以程序猿们需要补足这块的短板。
1.使用最多的左移(<<)、右移(>>) 。使用的方式:例如使用int来存储ip地址,255.255.255.255。ip一共四个区,每个区的数值是0-255。
2的8次方是256.也就是8个bit(8位)就能存储一个分区的数字。
let ipstr = '192.168.199.1';
function str2ip(ipstr){
let splists = ipstr.split('.');
let intip = 0;
for(let i = 0; i < splists.length; ++i){
intip = intip | (splists[i] << (8*i));
}
console.log(`转化成int = ${intip}`);
let stripArr = [];
for(let i = 0; i < 4; ++i){
stripArr.push((intip >> (8 * i)) & 0xff);
}
console.log(`重新组装ip${stripArr.join('.')}`);
}
str2ip(ipstr);
2.& 按位与操作。
0&0 = 0
0&1 =0
1&0 = 0
1&1 = 1
1>指定位清0:将某些位与0操作,进行清0处理
2>取指定位的值,经常用0xff来取最低8位的值。
3>用来判断奇偶性 if(a&0 == 0) 代替 if(a%2 == 0)
3.| 按位或操作
0|0 = 0
1|0 = 1
0|1 = 1
1|1 = 1
4.^按位异或运算
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 0
可以用0 来取原来的值。用1来取反。
function testAB(){
let a = 3;
let b = 129;
while(b != 0){
let _a = a ^b;
let _b = (a&b)<< 1;
a = _a;
b = _b;
}
console.log(`a + b = ${a}`);
}
testAB();
5.~ 按位取反
6.>>> 无符号右移