java右移位_Java移位运算
背景
java或android源碼中經(jīng)常會使用移位運算來代替乘除運算,因為移位運算的性能比乘除運算的高(PS:對于計算機(jī)而言,移位運算只是移了個位置),所以了解移位運算的計算過程對于我們閱讀源碼會有一定的幫助。
原碼、反碼、補(bǔ)碼
原碼是人腦最容易理解和計算的表示方式
第一位表示符號, 其余位表示值
-1的原碼是10000000 00000000 00000000 00000001
反碼是人腦無法直觀看出其數(shù)值的. 通常需要轉(zhuǎn)換成原碼在計算其數(shù)值
正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變,其余各個位取反
-1的反碼是11111111 11111111 11111111 11111110
補(bǔ)碼是人腦無法直觀看出其數(shù)值的. 通常需要轉(zhuǎn)換成原碼在計算其數(shù)值
正數(shù)的補(bǔ)碼就是其本身
負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
-1的補(bǔ)碼是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
結(jié)論:丟棄左邊指定位數(shù),右邊補(bǔ)0
右移運算符:>>
System.out.println(1>>1); // 0
System.out.println(1>>32); // 1
System.out.println(-1>>1); // -1,因為-1的二進(jìn)制反碼是11111111 11111111 11111111 11111111
System.out.println(-1>>32); // -1
結(jié)論:丟棄右邊指定位數(shù),左邊補(bǔ)上符號位
無符號右移運算符:>>>
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,所以實際上并沒有發(fā)生移位
結(jié)論:丟棄右邊指定位數(shù),左邊補(bǔ)上0
結(jié)論
對于機(jī)器而言,java中的移位運算都是對補(bǔ)碼執(zhí)行移位運算的,下面以-1<<1=-2為例進(jìn)行講解:
-1的原碼:10000000 00000000 00000000 00000001
-1的反碼:11111111 11111111 11111111 11111110
-1的補(bǔ)碼:11111111 11111111 11111111 11111111
執(zhí)行移位操作
-1移位后的補(bǔ)碼:11111111 11111111 11111111 11111110
-1移位后的反碼:11111111 11111111 11111111 11111101
-1移位后的原碼:10000000 00000000 00000000 00000010
得到最后的原碼十進(jìn)制值為-2
總結(jié)
以上是生活随笔為你收集整理的java右移位_Java移位运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机基础知识经典问答题,计算机基础知识
- 下一篇: java美元兑换,(Java实现) 美元