java位运算
1 /**
2 * 位运算符: &; |; ^; ~; >>; >>>; <<;
3 */
4 private void bitOperator() {
5 byte a = 23; // "00010111"
6 byte b = 26; // "00011010"
7
8 // 按位与, 两个运算数都为1时,结果为1,其余结果为0
9 int c = a & b; // "00010010" = 18
10 System.out.println("(c = a & b) = " + c);
11 // 按位或,两个运算数都为0时,结果为0,其余结果为1
12 int d = a | b; // "00011111" = 31
13 System.out.println("(d = a | b) = " + d);
14 // 按位异或,两个运算数相同时结果为0,不同时结果为1
15 int e = a ^ b; // "00001101" = 13
16 System.out.println("(e = a ^ b) = " + e);
17 // 按位非,0变成1,1变成0
18 int f = ~a; // "11101000" = -24,
19 // 注意,Java中采用补码存储数字,对于整数,原码与补码一致,
20 // 对于负数,符号位不变,将原码取反然后加1,得到补码,补码"11101000"对应的原码是"10011000"即-24
21 System.out.println("(f = ~a) = " + f);
22 // 右移,左边空出位以符号位填充
23 int g = a >> 1;// "00001011" = 11
24 System.out.println("(g = a >> 1) = " + g);
25 // 右移,左边空出位以0填充
26 int h = a >>> 1;// "00001011" = 11
27 System.out.println("(h = a >>> 1)" + h);
28 // 对负数操作时,>>和>>>得到结果会不一样
29 System.out.println("(-24 >> 1) = " + (-24 >> 1) + "\t (-24 >>> 1) = " + (-24 >>> 1));
30 // 左移
31 int i = a << 1; // "00101110" = 46
32 System.out.println("(a << 1) = " + i);
33
34 // 可以发现,右移1位相当于运算数除以2,左移1位相当于运算数乘以2,
35 // 实质上,右移n位,相当于运算数除以2的n次方,左移n位,相当于运算数乘以2的n次方,读者可以试验。
36 // 在进行乘除法操作时,开发者要有意识的利用这个特点,以提高运算速度。
37 }