Java基础——左移和右移
首先要明白一點,這里面所有的操作都是針對存儲在計算機中中二進(jìn)制的操作,那么就要知道,正數(shù)在計算機中是用二進(jìn)制表示的,負(fù)數(shù)在計算機中使用補碼表示的。
左移位:<<,有符號的移位操作
左移操作時將運算數(shù)的二進(jìn)制碼整體左移指定位數(shù),左移之后的空位用0補充
右移位:>>,有符號的移位操作
右移操作是將運算數(shù)的二進(jìn)制碼整體右移指定位數(shù),右移之后的空位用符號位補充,如果是正數(shù)用0補充,負(fù)數(shù)用1補充。
例子:
public static void main(String[] args)
{
System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位
System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位
}
輸出結(jié)果
12
-12
1
-2
下面解釋一下:
? ?00000000 00000000 00000000 00000011 +3在計算機中表示
00000000 00000000 00000000 0000001100 左移2位,補0,結(jié)果為12
----------------------------------------------------------------------------------------------
? ?00000000 00000000 00000000 00000011 +3在計算機中表示
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111101 -3在計算機中表示
11111111 11111111 11111111 1111110100 左移2位,補0,結(jié)果為負(fù)數(shù),就是補碼了,求原碼
10000000 00000000 00000000 00001011
10000000 00000000 00000000 00001100 結(jié)果-12
----------------------------------------------------------------------------------------------
這也說明了一個問題:在計算機中,以1開頭的就是補碼的形式,是負(fù)數(shù)。
??? 00000000 00000000 00000000 00000110 +6在計算機中表示方法
0000000000 00000000 00000000 00000110 右移兩位,正數(shù)補0,結(jié)果為1
----------------------------------------------------------------------------------------------
?? 00000000 00000000 00000000 00000110 +6在計算機中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在計算機中的表示
1111111111 11111111 11111111 11111010 右移兩位,結(jié)果為負(fù)數(shù)
1000000000 00000000 00000000 000001
1000000000 00000000 00000000 000010 結(jié)果為-2
這個地方很容易弄混,多想幾次就會慢慢理解了。
上面解釋了帶符號的移位操作,下面解釋一下不帶符號的移位操作
無符號的移位只有右移,沒有左移使用“>>>”進(jìn)行移位,都補充0
例如:
public static void main(String[] args)
{
System.out.println(6>>>2);
System.out.println(-6>>>2);
}
結(jié)果:
1
1073741822
分析:
?? 00000000 00000000 00000000 00000110 +6在計算機中表示方法
0000000000 00000000 00000000 00000110 右移兩位,正數(shù)補0,結(jié)果為1
-----------------------------------------------------------------------------------------------------
?? 00000000 00000000 00000000 00000110 +6在計算機中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在計算機中的表示
0011111111 11111111 11111111 11111010 右移兩位,補充0,結(jié)果為1073741822
?
以下來自:http://jefflee.javaeye.com/blog/203863
可以參考
移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
(1)<< : (left-shift), 最低位補0
(2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號為為1則高位補1, 是0則補0,也就是邏輯右移
(3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術(shù)右移
(4)移位操作的數(shù)據(jù)類型可以是byte, char, short, int, long型,但是對byte, char, short進(jìn)行操作時會先把它們變成一個int型,最后得到一個int型的結(jié)果,對long型操作時得到一個long型結(jié)果,不可以對boolean型進(jìn)行操作。
(5)移位操作符可以和=合并起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位后的值重新賦給a。當(dāng)時在使用這三個操作符對 byte, char, short型數(shù)據(jù)進(jìn)行操作時要注意,例如有一下代碼片段:
?
運行結(jié)果是:
-4
-4
508
這說明了在操作a <<= 2 執(zhí)行過程是這樣的:先將 byte型的數(shù) 127變成int型,左移2位得到 508,然后把508賦給byte型變量a時只是簡單地"折斷"(truncate)得到數(shù)-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確實是損失精度了),但是如果你把a <<= 2改成 a = a << 2;編譯器就會提示可能損失精度了。
?
================================================================================
移位操作的簡單計算方法
>>右移操作
x>>y
就是x除以2的y此方,取整數(shù)
<<左移操作
X<<y
就是x乘以2的y次方
?
轉(zhuǎn)載于:https://www.cnblogs.com/mukekeheart/p/5669353.html
總結(jié)
以上是生活随笔為你收集整理的Java基础——左移和右移的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】CMake 简介和 CMake
- 下一篇: TF-IDF(term frequenc