记录可以用于平时使用的位运算,但是js中并不适用位运算.
因为按照ES标准,两个需要运算的值会被先转为有符号的32位整型。所以超过32位的整数会被截断,而小数部分则会被直接舍弃
而且位操作符最主要的应用大概就是作为标志位与掩码,之前用位操作符是因为当时内存小,创建变量多占内存,但是现在内存都大了,不至于这么扣扣嗖嗖的,何况使用位运算如果后续接手的同事不熟悉,还会使代码可读性降低
1.奇偶判断
value & 1
2.是否是2的整数幂
(!(n&(n-1)) ) && n //&&n是为了排除0的情况,log2(0)不是整数
3.乘除法(对2的幂操作)
如果要×或÷2的幂数,可以直接位运算
x = x << 1; 左移一位=乘上2的1+1次幂
x = x >> 1; 右移一位=除上2的1+1次幂
4.取整
value|0 其实是位运算都会忽略小数,因为会把整数部分转成二进制
(x ^ (x >> 31)) - (x >> 31)
5.正负号转换
~value + 1
6.位置交换
使用^可以位置交换
a = a^b;b = a^b;a = a^b;但是es6可以用解构赋值
7.取余数(对2的幂取余)
100%2=>100 & (2-1)
100%4=>100 & (4-1)
9.算术
~value=>-(value+1)所以得以下
-~n == n + 1
~-n == n - 1
取反~n + 1
10.取绝对值
(value ^ (value >> 31)) - (value >> 31)//整数异或0本身;负数异或-1取反+1就是绝对值
value>>31 ==>取符号位,整数为0,负数为-1