逻辑位运算符与逻辑运算符的运算方式是相同,但是针对的对象不同。逻辑位运算符针对的二进制的整数值,而逻辑运算符针对的是非二进制的其他类型数据。
&运算符(位与)表示布尔AND操作。它对二进制值逐位进行比较,并根据表9所示的换算表返回结果。表9 &运算符
第一个值的数位值 | 第二个值的数位值 | 运算结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
【示例1】12和5进行位与运算,则返回值为4。
alert(12&5); // 返回值4
如图4所示以算式的形式解析12和5进行位与运算的过程。通过位与运算,只有第3位的值为全true,故返回true,其他位均返回false。
图4 12和5进行位与运算
【提示】
在位运算中数值1表示true,0表示false,反之亦然。
|运算符(位或)表示布尔OR操作。位或运算将根据表10所示的换算表返回结果。
表10 |运算符
第一个值的数位值 | 第二个值的数位值 | 运算结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
【示例2】12和5进行位或运算,则返回值为13。
alert(12|5); // 返回值13
如图5所示以算式的形式解析12和5进行位或运算的过程。通过位或运算,只有第2位的值为false外,其他位均返回true。
图5 12和5进行位或运算
^运算符(位异或)表示布尔XOR操作。位异或运算将根据表11所示的换算表返回结果。
表11 ^运算符
第一个值的数位值 | 第二个值的数位值 | 运算结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
【示例3】12和5进行位异或运算,则返回值为9。
alert(12^5); // 返回值9
如图6所示以算式的形式解析12和5进行位异或运算的过程。通过位异或运算,第1、4位的值为true,而第2、4位的值为false。
图6 12和5进行位异或运算
~运算符(位非)表示布尔NOT操作。位非运算将根据三步操作进行处理:
第1步,把运算数转换为32位的二进制整数。
第2步,逐位反码,即逐位进行取反操作。
第3步,把二进制反码转换为十进制浮点数。
【示例4】对12进行位非运算,则返回值为-13。
alert(~12); // 返回值-13
如图7所示以算式的形式解析对12进行位非运算的过程。
图7 对12进行位非运算
位非运算本质上就是对数字进行求负运算,然后再减1。因此,可以使用如下方法也可以获得相同的结果。
~12 = -12-1;
如果使用如下语句则可以检测它们是否相等:
alert(~12 == -12-1); // 返回true