- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java基礎之位運算知識總結
java位運算可以分為左移和右移,其中右移還有無(wú)符號右移。
java只對整型位移,可以分為int體系和long體系。int體系包括(byte, short, int, char),long體系只包含long。int體系中進(jìn)行位運算時(shí),除int類(lèi)型外都會(huì )先轉換為int再進(jìn)行運算。.
無(wú)符號右移指的是,向右移動(dòng)時(shí),左邊補位的是0。
一般來(lái)說(shuō),右移左移常用作乘2n 或者除以2n。(右移除以2n,左移乘以2n)
int i1 = 4; int r1 = i1 >> 2; // 除以2^2 int r2 = i1 << 2; // 乘以2^2 System.out.println(r1); // 1 System.out.println(r2); // 16
位運算實(shí)際上是將數值對應的二進(jìn)制進(jìn)行左右位移操作。java中數值的存儲、運算是以補碼的形式進(jìn)行的。數值有三種存儲方式:原碼、反碼、補碼。
原碼的最高位為符號位(0為正數,1為負數),其余位用于存儲數值,以8位整型為例,2對應:
0000 0010
-2對應:
1000 0010
反碼和補碼的正數都與原碼相同。反碼的負數在原碼的基礎上進(jìn)行,除符號位外,其余按位取反。例如2的反碼為:
0000 0010(正數不變)
-2的反碼為:
1111 1101
補碼在反碼的基礎上進(jìn)行,反碼加1就變成補碼。
2:
0000 0010(正數不變)
-2為:
1111 1110
8位整型,反碼可以表示的范圍為:[-128,127]
-128的反碼表示為:
1000 0000
可以理解為:
1 1000 0000(原) => 1 0111 1111(反) => 1 1000 0000(補) => 1000 0000(補)
(查看了一些解釋?zhuān)?128的補碼規定為1000 0000,若不理解,可以先跳過(guò)。)
左移即是補碼向左移動(dòng),右邊空出的用0補位,右移就是向右動(dòng),左邊空出來(lái)的以符號位補位。(無(wú)符號右移,左邊空出來(lái)的以0補位)。下面以具體代碼舉例(int 為32位):
正數:
int i1 = 4; // 0000 0000 0000 0000 0000 0000 0000 0100 int r1 = i1 >> 2; // 期望 0000 0000 0000 0000 0000 0000 0000 0001 = 1 int r2 = i1 << 2; // 期望 0000 0000 0000 0000 0000 0000 0001 0000 = 16 System.out.println(r1); // 實(shí)際:1 System.out.println(r2); // 實(shí)際:16
負數:
int i2 = -4; // 1111 1111 1111 1111 _ 1111 1111 1111 1100 int r3 = i2 >> 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 1111 = -1 int r4 = i2 << 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 0000 = -16 int rx = i2 >>> 1; // 期望: 0111 1111 1111 1111 _ 1111 1111 1111 1110 = 2147483646 System.out.println(rx); // 實(shí)際:2147483646 System.out.println(r3); // 實(shí)際:-1 System.out.println(r4); // 實(shí)際:-16
rx記錄無(wú)符號右移結果,移動(dòng)后左邊補位以0補滿(mǎn),于是結果就變成了2147483646
int類(lèi)型的范圍為[-2147483648, 2147483647],下面對上下界分別進(jìn)行測試:
// 邊界值測試: int imax = Integer.MAX_VALUE; // 21_4748_3647 = 0111_1111_1111_1111_1111_1111_1111_1111 (2^31-1) int r5 = imax >> 2; // 0001_1111_1111_1111_1111_1111_1111_1111 = (2^30 - 1) = 5_3687_0911 System.out.println(r5);// 實(shí)際:5_3687_0911 int r6 = max << 2; // 1111_1111_1111_1111_1111_1111_1111_1100 (補碼形式 ) = -4 System.out.println(r6);// 實(shí)際:-4 int imin = Integer.MIN_VALUE; //-21_4748_3648=1000_0000_0000_0000_0000_0000_0000_0000 int r7 = imin << 1; // 0000_0000_0000_0000_0000_0000_0000_0000 = 0 System.out.println(r7); // 實(shí)際:0
根據位運算原理,在邊界測試的結果并不一定是乘以2n或者除以2n。對邊界值進(jìn)行位運算時(shí),需要注意。
到此這篇關(guān)于Java基礎之位運算知識總結的文章就介紹到這了,更多相關(guān)Java位運算內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站