位运算符在开发中用到的比较少,这里写出来只是做个记录。这里我们需要清楚两个概念:
1.什么是逻辑运算符 : 简单点来说,逻辑运算符只会对结果返回true或false。
2.什么是位运算符 : 位运算符并不会对结果返回布尔(boolean)值,而是进行数学运算。
$a & $b And (按位与) :将$a和$b同时为1的位,置为1
比如数字 1 & 2 = 00000001 & 00000010 = 0
$a | $b Or(按位或) : 将$a或$b为1的位,置为1
比如数字 1 | 2 = 00000001 | 00000010 = 3
$a ^ $b Xor(按位异或) :将$a或$b中一个为0,另一个为1的位,置为1
比如数字 1 ^ 2 = 00000001 | 00000010 = 3
这里需要理清按位或和按位异或的区别,按位或的话如果两个位都位1会置为1,反正只要有其中有一个为1就可以。但是按位异或不行,它要求必须一个为1,另一个为0才置为1。
~ $b Not(按位取反) :将$b中为0的位,置为1,为1的位,置为0
比如 ~2
1. 2的二进制(比如我的计算机是32位的) = 0000 0000 0000 0000 0000 0000 0000 0010
2. 按位取反 = 1111 1111 1111 1111 1111 1111 1111 1101
3. = -3
按位取反的求值方式要比上面几个位运算符复杂些。现代计算机普遍使用补码表示负数。知道一个数的补码,首先看它的最左一位(0代表正,1代表负)。对其取反后再加1,得到源码。
现在按位取反的二进制数为:1111 1111 1111 1111 1111 1111 1111 1101,现在再对其进行取反然后加
1。0000 0000 0000 0000 0000 0000 0000 0010 + 1 = 0000 0000 0000 0000 0000 0000 0000 0011 = -3
按位取反的本质是对数字进行求负运算,再减1。比如上面的~2可以快速计算出结果:~2 = -2 - 1 = -3
$a << $b Shift left(左移) : 将$a中的位向左移动$b次,每移动一次代表乘以2
比如 2 << 2 = 0000 0010 << 2
= 0000 1000
= 4
$a >> $b Shift right(右移) : 将$a中的位向右移动$b次,每移动一次代表除以2
比如在 2 >> 2 = 0000 0010 >> 2
= 0000 0000
= 0