以Java为例讲解位移
位运算
向左位移操作符<<
向左位移操作符会把一个数字向左位移,右边的位用0来补充。n << s 的值是将n向左移动s位。相当于将操作数乘以2的s次幂。
1 | System.out.println(1 << 3); // 1 x 2^3 |
例如,将一个值位1的int类型数字向左移动3个位置(1 << 3),结果是8.
1 | # 将操作数转为二进制. |
int类型操作数,只有位移距离的前5位会使用,位移的距离必须在0~31之间,如果传递的数字大于31,只有前5位会使用,也就是说如果int类型x<<32等同于 x << 0; x << 33 等同于 x << 1;
如果左操作数是long类型,位移距离中只有前6位会使用,实际位移距离的范围在0~63之间。
向右位移操作符>>
向右位移操作符>>将左边的操作数向右位移右边操作数所指定的位数。n >> s 是将n向右移动s位。结果是n/2^s
例如 16 >> 1等于8,16/(2^1)
1 | 0000 0000 0000 0000 0000 0000 0001 0000 |
无符号向右位移操作符>>>
n >>> s,取决于n是正数还是负数,对于一个正数n,其结果的值和 n>>s相同。
如果n是负数,取决于n的类型
int类型n结果是(n>>s) + (2<<~s)
long类型n结果是(n>>s)+ (2L<<~s)
逻辑运算
与运算符
& 两个操作数中位都为1,结果才为1,否则结果为0
1 | 129 |
或运算符
| 两个位只要有一个为1,那么结果就是1,否则就为0
1 | 129 |
非运算符
~ 如果位为0,结果是1,如果位为1,结果为0
TODO
1 | 0000 0000 0000 0000 0000 0000 0000 0010 |
异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。
1 | 129 |