java右移位_Java移位运算
背景
java或android源碼中經常會使用移位運算來代替乘除運算,因為移位運算的性能比乘除運算的高(PS:對于計算機而言,移位運算只是移了個位置),所以了解移位運算的計算過程對于我們閱讀源碼會有一定的幫助。
原碼、反碼、補碼
原碼是人腦最容易理解和計算的表示方式
第一位表示符號, 其余位表示值
-1的原碼是10000000 00000000 00000000 00000001
反碼是人腦無法直觀看出其數值的. 通常需要轉換成原碼在計算其數值
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反
-1的反碼是11111111 11111111 11111111 11111110
補碼是人腦無法直觀看出其數值的. 通常需要轉換成原碼在計算其數值
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
-1的補碼是11111111 11111111 11111111 11111111
左移運算符:<<
System.out.println(1<<1); // 2
System.out.println(1<<32); // 1
System.out.println(-1<<1); // -2
System.out.println(-1<<32); // -1
結論:丟棄左邊指定位數,右邊補0
右移運算符:>>
System.out.println(1>>1); // 0
System.out.println(1>>32); // 1
System.out.println(-1>>1); // -1,因為-1的二進制反碼是11111111 11111111 11111111 11111111
System.out.println(-1>>32); // -1
結論:丟棄右邊指定位數,左邊補上符號位
無符號右移運算符:>>>
System.out.println(1>>>1); // 0
System.out.println(1>>>32); // 1
System.out.println(-1>>>1); // 2147483647
System.out.println(-1>>>32); // -1,這里仍然是-1,是因為int類型是32位,32%32=0,所以實際上并沒有發生移位
結論:丟棄右邊指定位數,左邊補上0
結論
對于機器而言,java中的移位運算都是對補碼執行移位運算的,下面以-1<<1=-2為例進行講解:
-1的原碼:10000000 00000000 00000000 00000001
-1的反碼:11111111 11111111 11111111 11111110
-1的補碼:11111111 11111111 11111111 11111111
執行移位操作
-1移位后的補碼:11111111 11111111 11111111 11111110
-1移位后的反碼:11111111 11111111 11111111 11111101
-1移位后的原碼:10000000 00000000 00000000 00000010
得到最后的原碼十進制值為-2
總結
以上是生活随笔為你收集整理的java右移位_Java移位运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机基础知识经典问答题,计算机基础知识
- 下一篇: 变化世界中的军事地质学