Java 移位运算符的复合_Java移位运算符
移位運(yùn)算符就是在二進(jìn)制的基礎(chǔ)上對(duì)數(shù)字進(jìn)行平移。按照平移的方向和填充數(shù)字的規(guī)則分為三種:<>(帶符號(hào)右移)和>>>(無符號(hào)右移)。
在移位運(yùn)算時(shí),byte、short和char類型移位后的結(jié)果會(huì)變成int類型,對(duì)于byte、short、char和int進(jìn)行移位時(shí),規(guī)定實(shí)際移動(dòng)的次數(shù)是移動(dòng)次數(shù)和32的余數(shù),也就是移位33次和移位1次得到的結(jié)果相同。移動(dòng)long型的數(shù)值時(shí),規(guī)定實(shí)際移動(dòng)的次數(shù)是移動(dòng)次數(shù)和64的余數(shù),也就是移動(dòng)66次和移動(dòng)2次得到的結(jié)果相同。
三種移位運(yùn)算符的移動(dòng)規(guī)則和使用如下所示: <
語法格式: 需要移位的數(shù)字 << 移位的次數(shù)
例如: 3 << 2,則是將數(shù)字3左移2位
計(jì)算過程: 3 << 2
首先把3轉(zhuǎn)換為二進(jìn)制數(shù)字0000 0000 0000 0000 0000 0000 0000 0011,然后把該數(shù)字高位(左側(cè))的兩個(gè)零移出,其他的數(shù)字都朝左平移2位,最后在低位(右側(cè))的兩個(gè)空位補(bǔ)零。則得到的最終結(jié)果是0000 0000 0000 0000 0000 0000 0000 1100,則轉(zhuǎn)換為十進(jìn)制是12.數(shù)學(xué)意義:
在數(shù)字沒有溢出的前提下,對(duì)于正數(shù)和負(fù)數(shù),左移一位都相當(dāng)于乘以2的1次方,左移n位就相當(dāng)于乘以2的n次方。
>>運(yùn)算規(guī)則:按二進(jìn)制形式把所有的數(shù)字向右移動(dòng)對(duì)應(yīng)巍峨位數(shù),低位移出(舍棄),高位的空位補(bǔ)符號(hào)位,即正數(shù)補(bǔ)零,負(fù)數(shù)補(bǔ)1.
語法格式: 需要移位的數(shù)字 >> 移位的次數(shù)
例如11 >> 2,則是將數(shù)字11右移2位
計(jì)算過程:11的二進(jìn)制形式為:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后兩個(gè)數(shù)字移出,因?yàn)樵摂?shù)字是正數(shù),所以在高位補(bǔ)零。則得到的最終結(jié)果是0000 0000 0000 0000 0000 0000 0000 0010.轉(zhuǎn)換為十進(jìn)制是3.數(shù)學(xué)意義:右移一位相當(dāng)于除2,右移n位相當(dāng)于除以2的n次方。
>>>運(yùn)算規(guī)則:按二進(jìn)制形式把所有的數(shù)字向右移動(dòng)對(duì)應(yīng)巍峨位數(shù),低位移出(舍棄),高位的空位補(bǔ)零。對(duì)于正數(shù)來說和帶符號(hào)右移相同,對(duì)于負(fù)數(shù)來說不同。
其他結(jié)構(gòu)和>>相似。
小結(jié)
二進(jìn)制運(yùn)算符,包括位運(yùn)算符和移位運(yùn)算符,使程序員可以在二進(jìn)制基礎(chǔ)上操作數(shù)字,可以更有效的進(jìn)行運(yùn)算,并且可以以二進(jìn)制的形式存儲(chǔ)和轉(zhuǎn)換數(shù)據(jù),是實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議解析以及加密等算法的基礎(chǔ)。
實(shí)例操作: public class URShift {
public static void main(String[] args) {
int i = -1;
i >>>= 10;
//System.out.println(i);
mTest();
}
public static void mTest(){
//左移
int i = 12; //二進(jìn)制為:0000000000000000000000000001100
i <<= 2; //i左移2位,把高位的兩位數(shù)字(左側(cè)開始)拋棄,低位的空位補(bǔ)0,二進(jìn)制碼就為0000000000000000000000000110000
System.out.println(i); //二進(jìn)制110000值為48;
System.out.println("
");
//右移
i >>=2; //i右移2為,把低位的兩個(gè)數(shù)字(右側(cè)開始)拋棄,高位整數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1,二進(jìn)制碼就為0000000000000000000000000001100
System.out.println(i); //二進(jìn)制碼為1100值為12
System.out.println("
");
//右移example
int j = 11;//二進(jìn)制碼為00000000000000000000000000001011
j >>= 2; //右移兩位,拋棄最后兩位,整數(shù)補(bǔ)0,二進(jìn)制碼為:00000000000000000000000000000010
System.out.println(j); //二進(jìn)制碼為10值為2
System.out.println("
");
byte k = -2; //轉(zhuǎn)為int,二進(jìn)制碼為:0000000000000000000000000000010
k >>= 2; //右移2位,拋棄最后2位,負(fù)數(shù)補(bǔ)1,二進(jìn)制嗎為:11000000000000000000000000000
System.out.println(j); //二進(jìn)制嗎為11值為2
}
}
在Thinking in Java第三章中的一段話:
移位運(yùn)算符面向的運(yùn)算對(duì)象也是
二進(jìn)制的“位”。 可單獨(dú)用它們處理整數(shù)類型(主類型的一種)。左移位運(yùn)算符(<>)則將運(yùn)算符左邊的運(yùn)算對(duì)象向右移動(dòng)運(yùn)算符右側(cè)指定的位數(shù)。“有符號(hào)”右移位運(yùn)算符使用了“符號(hào)擴(kuò)展”:若值為正,則在高位插入0;若值為負(fù),則在高位插入1。Java也添加了一種“無符號(hào)”右移位運(yùn)算符(>>>),它使用了“零擴(kuò)展”:無論正負(fù),都在高位插入0。這一運(yùn)算符是C或C++沒有的。
若對(duì)char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會(huì)自動(dòng)轉(zhuǎn)換成一個(gè)int。只有右側(cè)的5個(gè)低位才會(huì)用到。這樣可防止我們?cè)谝粋€(gè)int數(shù)里移動(dòng)不切實(shí)際的位數(shù)。若對(duì)一個(gè)long值進(jìn)行處理,最后得到的結(jié)果也 是long。此時(shí)只會(huì)用到右側(cè)的6個(gè)低位,防止移動(dòng)超過long值里現(xiàn)成的位數(shù)。但在進(jìn)行“無符號(hào)”右移位時(shí),也可能遇到一個(gè)問題。若對(duì)byte或 short值進(jìn)行右移位運(yùn)算,得到的可能不是正確的結(jié)果(Java 1.0和Java 1.1特別突出)。它們會(huì)自動(dòng)轉(zhuǎn)換成int類型,并進(jìn)行右移位。但“零擴(kuò)展”不會(huì)發(fā)生,所以在那些情況下會(huì)得到-1的結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的Java 移位运算符的复合_Java移位运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window10配置OpenGL ES3
- 下一篇: 富文本Ueditor