我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解。平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更高的。下面通过一些实例来加深对位运算的理解。
按位与(&)
&&运算符我们都知道,只有两个都为真,结果才为真。&道理是一样的,只有两个数的值为1时,才返回1。例如1和3的按位与操作:
0001
& 0011
---------
0001
只有对应的数为1时,结果才为1,其他都为0。
判断一个数是奇数还是偶数,我们会用求余数来判断:
function assert(n) { if (n % 2 === 1) { console.log("n是奇数"); } else { console.log("n是偶数"); }}assert(3); // "n是奇数"
我们也可以用一个数和1进行按位&操作来判断,而且速度更快:
function assert(n) {if (n & 1) { console.log("n是奇数");} else { console.log("n是偶数");}}assert(3); // "n是奇数"
下面是位运算过程:
1 = 0001
3 = 0011
--------
& = 0001
奇数的二进制码的最后一位数肯定是1,而1只有最后一位为1,按位&操作之后,结果肯定只有最后一位数为1。而偶数的二进制表示的最后一位数是0,和1进行按位&操作,结果所有位数都为0。
按位或(|)
|与||操作符的道理也是一样的,只要两个数中有一个数为1,结果就为1,其他则为0。
0001
| 0011
---------
0011
对浮点数向下求整,我们会用下面的方法:
var num = Math.floor(1.1); // 1
我们也可以用位运算来求整:
var num = 1.1 | 0; // 1
其实浮点数是不支持位运算的,所以会先把1.1转成整数1再进行位运算,就好像是对浮点数向下求整。所以1|0的结果就是1。
按位非(~)
按位非就是求二进制的反码:
var num = 1; // 二进制 00000000000000000000000000000001
var num1 = ~num; // 二进制 11111111111111111111111111111110
我们知道,js中的数字默认是有符号的。有符号的32位二进制的最高位也就是第一位数字代表着正负,1代表负数,0代表整数。那到底11111111111111111111111111111110等于多少呢?最高位为1代表负数,负数的二进制转化为十进制:符号位不变,其他位取反加1。取反之后为10000000000000000000000000000001,加1之后为10000000000000000000000000000010,十进制为-2。
按位异或(^)
按位异或是两个数中只有一个1时返回1,其他情况返回0。
新闻热点
疑难解答
图片精选