算术移位:>>,有符号的移位操作,右移之后的空位用符号位补充,如果是
正数用 0 补充,负数用1补充。
例1:
-4>>1
-4的原码
10000000 00000000 00000000 00000100
-4的补码
11111111 11111111 11111111 11111100
0 向右移出 1 位后
11111111 11111111 11111111 11111110
重新取反加一变原码:答案 -2
10000000 00000000 00000000 00000010
逻辑右移:>>>,不管正数、负数,左端都用0补充。
例2:-1>>>1
10000000 00000000 00000000 00000001 -1的原码
11111111 11111111 11111111 11111111 -1的补码
01111111 11111111 11111111 11111111 1 向右移出1位后直接给出答案:2^31-1
例3:6>>>2
00000000 00000000 00000000 00000110 6的原码
00000000 00000000 00000000 00000001 10 向右移出2位后直接给出答案:1
--------------------------------------------------------------------------------------------------------------------------
补充一个例子
byte b = -64;
(b & 0xFF ) >> 4 算术右移4位之后可以拿到高4位的值,原理:
由于移位是以32位为标准的(Why?)
10000000 00000000 00000000 01000000 -64原码
11111111 11111111 11111111 11000000 -64补码
和0xFF相与之后,
00000000 00000000 00000000 11000000 然后算术右移位
00000000 00000000 00000000 0000 1100 12
--------------------------------------------
( b >>> 4 ) & 0x0F 也可以拿到高4位的值 原理:
同上
逻辑右移之后
00001111 11111111 11111111 11111100
跟0x0F相与之后
00000000 00000000 0000000 00001100 也是12
拿低4位更简单了
直接 b & 0x0F 就是了
--------------------------------------------------------------------------------
Long等基本数据类型的装箱类型有个判断符号位正负的方法,现举例如下:
public static int signum(long i)
{
// HD, Section 2-7
return (int) ((i >> 63) | (-i >>> 63));
}
如果long是正数,则左边是0000 0000 0000 0000 0000 0000 0000 0000 .......0000
右边是0000 0000 0000 ....................................................1
则最终结果是+1;
如果long是负数,
则左边是11111111111111111111111..................111111111111
右边是 00000000000000000000000...................000000000000
则最终结果是-1
如果long是0,
左边0的补码是000000000000000000000000000000000000000000000
-0的补码也是 000000000000000000000000......................000000000
所以结果是0