java右移位_Java移位运算
背景
java或android源碼中經(jīng)常會(huì)使用移位運(yùn)算來代替乘除運(yùn)算,因?yàn)橐莆贿\(yùn)算的性能比乘除運(yùn)算的高(PS:對(duì)于計(jì)算機(jī)而言,移位運(yùn)算只是移了個(gè)位置),所以了解移位運(yùn)算的計(jì)算過程對(duì)于我們閱讀源碼會(huì)有一定的幫助。
原碼、反碼、補(bǔ)碼
原碼是人腦最容易理解和計(jì)算的表示方式
第一位表示符號(hào), 其余位表示值
-1的原碼是10000000 00000000 00000000 00000001
反碼是人腦無法直觀看出其數(shù)值的. 通常需要轉(zhuǎn)換成原碼在計(jì)算其數(shù)值
正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變,其余各個(gè)位取反
-1的反碼是11111111 11111111 11111111 11111110
補(bǔ)碼是人腦無法直觀看出其數(shù)值的. 通常需要轉(zhuǎn)換成原碼在計(jì)算其數(shù)值
正數(shù)的補(bǔ)碼就是其本身
負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
-1的補(bǔ)碼是11111111 11111111 11111111 11111111
左移運(yùn)算符:<<
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
右移運(yùn)算符:>>
System.out.println(1>>1); // 0
System.out.println(1>>32); // 1
System.out.println(-1>>1); // -1,因?yàn)?1的二進(jìn)制反碼是11111111 11111111 11111111 11111111
System.out.println(-1>>32); // -1
結(jié)論:丟棄右邊指定位數(shù),左邊補(bǔ)上符號(hào)位
無符號(hào)右移運(yùn)算符:>>>
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,是因?yàn)閕nt類型是32位,32%32=0,所以實(shí)際上并沒有發(fā)生移位
結(jié)論:丟棄右邊指定位數(shù),左邊補(bǔ)上0
結(jié)論
對(duì)于機(jī)器而言,java中的移位運(yùn)算都是對(duì)補(bǔ)碼執(zhí)行移位運(yùn)算的,下面以-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 正则