位运算:

左移位:<<

/* 00000001 << 1 = 00000010 */
1 << 1 == 2 

/* 00000001 << 3 = 00001000 */
1 << 3 == 8

右移位:>> 是有符号操作符,使用最高位来表示数值的正负,负数的最高位永远为1。一个以1开头的二进制数移位后还将以1开头,一个以0开头的二进制树移位后还将以0开头。

/* 11111111 11111111 11111111 11110000 >> 4 = 11111111 11111111 11111111 11111111 */
0xFFFFFFF0 >> 4 == 0xFFFFFFFF 

/* 00001111 11111111 11111111 11111111 >> 4 = 00000000 11111111 11111111 11111111 */
0x0FFFFFFF >> 4 == 0x00FFFFFF

可以使用叫作“无符号右移”运算符的第三个操作符:>>>来实现以“0”填充的移位,这种移位会忽略符号位并总是用“0”来填充。最大的用途是迅速求2的幂。1向左移1位是2,移2位是4,相似的,向右移1位相当于是把该数除以2。

/* 10000000 00000000 00000000 00000000 >>> 1 = 01000000 00000000 00000000 00000000 */
0x80000000 >>> 1 == 0x40000000

/* 10000000 00000000 00000000 00000000 >> 1 = 11000000 00000000 00000000 00000000 */
0x80000000 >> 1  == 0xC0000000

位运算操作符

以下是Java中四个常见的位操作符:
~ : 按位取反
& : 按位与(全1为1,有0则为0)
| : 按位或(有1为1,全0则为0)
^ : 按位异或(相同为0,不同为1)

比如:

1010 & 0101 == 0000
1100 & 0110 == 0100

1010 | 0101 == 1111
1100 | 0110 == 1110

~1111 == 0000
~0011 == 1100

1010 ^ 0101 == 1111
1100 ^ 0110 == 1010

你可以通过“或”运算,把一个二进制数上的指定位“设置”为1,并且不会影响到其他位。
10000001 | 00100000 = 10100001 /* 第五位设为1 */
10000001 | 1 << 5 = 10100001 /* 同样作用 */
00000000 | 1 << 2 | 1 << 5 = 00100100