049_位移操作
1. 位移操作符
1.1. 沒有無符號左移
1.2. 無符號右移: >>>
1.3. 有符號左移: <<
1.4. 有符號右移: >>
2. 左移規(guī)則
2.1. 右邊空出來的位用0填補。
2.2. 高位左移溢出則舍棄高位。
3. 右移規(guī)則
3.1. 左邊空出的位用0或者1填補。正數(shù)用0填補, 負數(shù)用1填補。
3.2. 低位右移溢出則舍棄該位。
4. Java位移結果是整數(shù)。
5. 分析幾個右移操作
5.1. 0的有符號右移1位操作
0的補碼: ?????????????????0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
0右移1位, 高位用0填補: ?0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
結果是: 0
5.2. 0的無符號右移1位操作
0的補碼: ?????????????????0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
0右移1位, 高位用0填補: ?0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
結果是: 0
5.3. 1的有符號右移1位操作
1的補碼: ?????????????????0000 0000 ?0000 0000 ?0000 0000 ?0000 0001
1右移1位, 高位用0填補: ?0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
結果是: 0
5.4. 1的無符號右移1位操作
1的補碼: ?????????????????0000 0000 ?0000 0000 ?0000 0000 ?0000 0001
1右移1位, 高位用0填補: ?0000 0000 ?0000 0000 ?0000 0000 ?0000 0000
結果是: 0
5.5. 127的有符號右移1位操作
127的補碼: ??????????????0000 0000 ?0000 0000 ?0000 0000 ?0111 1111
127右移1位,高位用0填補: 0000 0000 ?0000 0000 ?0000 0000 ?0011 1111
結果是: 63
5.6. 127的無符號右移1位操作
127的補碼: ??????????????0000 0000 ?0000 0000 ?0000 0000 ?0111 1111
127右移1位,高位用0填補: 0000 0000 ?0000 0000 ?0000 0000 ?0011 1111
結果是: 63
5.7. char類型-1的有符號右移1位操作
-1的原碼: ??????????????????????????????????????????????????1000 0001
-1的反碼: ??????????????????????????????????????????????????1111 1110
-1的補碼: ??????????????????????????????????????????????????1111 1111
-1轉換成整形,高位用1填補: 1111 1111 ?1111 1111 ?1111 1111 ?1111 1111
-1右移1位, 高位用1填補: ?1111 1111 ?1111 1111 ?1111 1111 ?1111 1111
-1右移1位后的反碼: ??????1111 1111 ?1111 1111 ?1111 1111 ?1111 1110
-1右移1位后的原碼: ??????1000 0000 ?0000 0000 ?0000 0000 ?0000 0001
結果是: -1
5.8. char類型-1的無符號右移1位操作
-1的原碼: ??????????????????????????????????????????????????1000 0001
-1的反碼: ??????????????????????????????????????????????????1111 1110
-1的補碼: ??????????????????????????????????????????????????1111 1111
-1轉換成整形,高位用1填補: 1111 1111 ?1111 1111 ?1111 1111 ?1111 1111
-1右移1位, 高位用0填補: ?0111 1111 ?1111 1111 ?1111 1111 ?1111 1111
結果是: 2147483647
5.9. char類型-127的有符號右移1位操作
-127的原碼: ????????????????????????????????????????????????1111 1111
-127的反碼: ????????????????????????????????????????????????1000 0000
-127的補碼: ????????????????????????????????????????????????1000 0001
-127轉換成整形高位用1填: 1111 1111 ?1111 1111 ?1111 1111 ?1000 0001
-127右移1位, 高位用1填補: 1111 1111 ?1111 1111 ?1111 1111 ?1100 0000
-127右移1位的反碼: ??????1111 1111 ?1111 1111 ?1111 1111 ?1011 1111
-127右移1位的原碼: ??????1000 0000 ?0000 0000 ?0000 0000 ?0100 0000
結果是: 64
5.10. char類型-127的無符號右移1位操作
-127的原碼: ????????????????????????????????????????????????1111 1111
-127的反碼: ????????????????????????????????????????????????1000 0000
-127的補碼: ????????????????????????????????????????????????1000 0001
-127轉換成整形高位用1填: 1111 1111 ?1111 1111 ?1111 1111 ?1000 0001
-127右移1位, 高位用0填補: 0111 1111 ?1111 1111 ?1111 1111 ?1100 0000
結果是: 2147483584
5.11. char類型-128的有符號右移1位操作
-128的補碼: ????????????????????????????????????????????????1000 0000
-128轉換成整形高位用1填: 1111 1111 ?1111 1111 ?1111 1111 ?1000 0000
-128右移1位, 高位用1填補: 1111 1111 ?1111 1111 ?1111 1111 ?1100 0000
-128右移1位的反碼: ??????1111 1111 ?1111 1111 ?1111 1111 ?1011 1111
-128右移1位的原碼: ??????1000 0000 ?0000 0000 ?0000 0000 ?0100 0000
結果是: 64
5.12. char類型-128的無符號右移1位操作
-128的補碼: ????????????????????????????????????????????????1000 0000
-128轉換成整形高位用1填: 1111 1111 ?1111 1111 ?1111 1111 ?1000 0000
-128右移1位, 高位用0填補: 0111 1111 ?1111 1111 ?1111 1111 ?1100 0000
結果是: 2147483584
6. 分析幾個左移例子
6.1. 2147483647左移1位
2147483647補碼: ???????????????01111111 11111111 11111111 11111111
2147483647左移1位低位用0填補: 11111111 11111111 11111111 11111110
2147483647左移1位, 反碼: ??????11111111 11111111 11111111 11111101
2147483647左移1位, 原碼: ??????10000000 00000000 00000000 00000010
結果: -2
6.2. -2147483648左移1位
-2147483648補碼: ??????????????10000000 00000000 00000000 00000000
-2147483648左移1位低位用0填補: 00000000 00000000 00000000 00000000
結果: 0
6.3. -2147483647左移1位
-2147483647原碼: ??????????????11111111 11111111 11111111 11111111
-2147483647反碼: ??????????????10000000 00000000 00000000 00000000
-2147483647補碼: ??????????????10000000 00000000 00000000 00000001
-2147483647左移1位低位用0填補: 00000000 00000000 00000000 00000010
結果: 2
7. byte類型的所有值左移例子
// 位移的結果是整數(shù) // 左移沒有整數(shù)范圍都是乘以2 public static void byteLeftShift() {int count = 0;for(byte i = Byte.MIN_VALUE; count < Math.abs(Byte.MIN_VALUE) + Byte.MAX_VALUE + 1; i++) {count++;System.out.println(i + " " + (i << 1));} }8. byte類型的所有值右移例子
// 位移的結果是整數(shù) // 正數(shù)的右移, 移動1位是除2, 移動2位是除4, ..., 這個規(guī)律是完全正確的 // 負數(shù)右移按除法操作不可靠 public static void byteRightShift() {int count = 0;for(byte i = Byte.MIN_VALUE; count < Math.abs(Byte.MIN_VALUE) + Byte.MAX_VALUE + 1; i++) {count++;System.out.println(i + " " + (i >> 1) + " " + (i >>> 1));} }?
總結
- 上一篇: 051_原码反码补码概念
- 下一篇: 015_视图(Views)