按位运算符有6个:
- 按位与 &
- 按位或 |
- 按位异或 ^
- 取反 ~
- 右移 >>
- 左移 <<
应用
- 用一个数和1进行按位&操作来判断奇偶数,而且速度比判断余数更快
奇数的二进制码的最后一位数肯定是1,而1只有最后一位为1,按位&操作之后,结果肯定只有最后一位数为1。而偶数的二进制表示的最后一位数是0,和1进行按位&操作,结果所有位数都为0。
只要任何一位是0 &运算的结果就是 0,所以可以用&把某个变量不必要的位设为0, 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位, 用 & 0x0F就可以了(注:0x为16进制表示法,0x0F 对应的二进制为 0 0 0 0 1 1 1 1)
function assert(n) {
if (n & 1) {
console.log("n是奇数");
} else {
console.log("n是偶数");
}
}
assert(3); // "n是奇数"
- 用位运算 | 来向下求整
其实浮点数是不支持位运算的,所以会先把1.1转成整数1再进行位运算,就好像是对浮点数向下求整。所以1|0的结果就是1。
var num = 1.1 | 0; // 结果为1
- 用异或运算 ^ 调换两个数字的值
var num1 = 1, num2 = 2;
num1 = [num2, num2 = num1][0];
console.log(num1); // 2
console.log(num2); // 1
var num1 = 1, num2 = 2;
num1 ^= num2; // num1 = num1 ^ num2 = 1 ^ 2 = 3
num2 ^= num1; // num2 = num2 ^ (num1 ^ num2) = num1 = 1
num1 ^= num2; // num1 = num1 ^ num2 ^ num1 = num2 = 2
console.log(num1); // 2
console.log(num2); // 1
- 取反 ` 运算
对一个整数num按位求反, 等于它的 相反数减1,即 ~num = -num-1;
~~num == -(num-1)-1 === num; 对一个数两次求反结果为这个数本身
浮点数是不支持位运算的,所以会先直接去除小数部分,转成整数再进行位运算,就好像是对浮点数向下求整
~~可以进行类型转换,位运算会默认将非数字类型转换成数字类型再进行运算 (转换结果为整数 直接去除小数部分)
~~true == 1;
~~false == 0;
~~"" == 0;
~~"all" == 0;
~~"32all" == 0;
~~"all43" == 0;
~~[] == 0;
~~undefined ==0;
~~!undefined == 1;
~~null == 0;
~~!null == 1;
~~(5.9) == 5;
~~(5.2) == 5;
~~(-5.9) == -5;
- 移位运算符 左移<< , 右移>>
向左移 几位就等于乘 2 的几次方, 同理右移几位等于 除以 2 的几次方
2向前移动1位变成4 利用这个特性可以做乘法运算
同理 >> 则可以做除法运算
任何小数 把它 >> 0可以取整
如3.14159 >> 0 = 3;
其默认将非数字类型的转换为数字类型再做运算的性质与 ~~ , | 0 一样
2 << 1 = 4 // 2 向左移1位, 即为 2*2 得4
3 << 1 = 6 // 3 向左移1位, 即为 3*2 得6
8 >>1 = 4 // 8向右移1位, 即为 8/2 得4
网友评论