位右移是按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。
expr >> n
其中,n 指定值 expr 要移位的位数,n 必须为非负数。
运算符 | 作用 | 使用形式 | 举例 | 说明 |
---|---|---|---|---|
| | 位或 | a | b | 5 | 8 | 1. 运算的两个二进制位有一个为 1 时,结果就为 1 2. 两个都为 0 时结果才为 0 |
& | 位与 | a & b | 5 & 8 | 1. 运算的两个二进制位都为 1 时,结果就为 1,否则为 0 注意:任何数和 -1 进行位与运算时,最终结果都为任何数本身的十进制数 |
^ | 位异或 | a ^ b | 5 ^ 8 | 1. 运算的两个二进制位不同时,结果为 1,相同时,结果为 0 |
~ | 位取反 | ~a | ~5 | 1. 就是做 NOT 操作,1 取反后变 0,0 取反后按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐 |
<< | 位左移 | a << b | 5 << 2,表示整数 5 按位左移 2 位 | 1. 按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐 |
>> | 位右移 | a >> b | 5 >> 2,表示整数 5 按位右移 2 位 | 1. 按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。 |
所谓位运算,就是按照内存中的比特位(Bit)进行操作,这是计算机能够支持的最小单位的运算。程序中所有的数据在内存中都是以二进制形式存储的,位运算就是对这些二进制数据进行操作。包括按位与、按位或、按位取反、按位异或、按位左移和按位右移等位运算符。位运算必须先将数据转换为补码,然后在根据数据的补码进行操作。运算完成后,将得到的值转换为原来的类型(十进制数),返回给用户。
mysql> SELECT 1>>1,16>>2; +------+-------+ | 1>>1 | 16>>2 | +------+-------+ | 0 | 4 | +------+-------+
1 的补码为 0000 0001,右移 1 位之后变成 0000 0000,即整数 0;16 的补码为 0001 0000,右移两位之后变成 0000 0100,即整数 4。
mysql> SELECT -7>>2; +---------------------+ | -7>>2 | +---------------------+ | 4611686018427387902 | +---------------------+
-7 的补码为 60 个‘1’加 1001,右移两位之后变成 0011 加 56 个‘1’加 1110,即整数 4611686018427387902。