java中的編碼
Java隻存儲補碼
原碼
:二進制,最高位為符号位,0為正數,1為負數
反碼
:正數不變;負數符号位不變,原碼數值取反
補碼
:正數不變;負數反碼+1
移碼
:符号位取反
整數-3的二進制:
原碼為 10000000 00000000 00000000 00000011
反碼為 11111111 11111111 11111111 11111100
補碼為 11111111 11111111 11111111 11111101
按位操作符
1、
~
按位非:按位取反。
~4
的補碼:
00000000 00000000 00000000 00000100,逐位取反後得到:
11111111 11111111 11111111 11111011,轉為原碼即為-5.
2、
|
按位或:逐位進行邏輯或運算,例如:1|0=1,0|0=0,1|1=1,0|1=1
4|-5
:
4 二進制形式為:00000000 00000000 00000000 00000100,
-5二進制形式為:11111111 11111111 11111111 11111011,
逐位邏輯或運算:11111111 11111111 11111111 11111111,轉為原碼即為-1.
3、
&
按位與:逐位進行邏輯與 運算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。
4&-5
:
4 的二進制形式為:00000000 00000000 00000000 00000100,
-5的二進制形式為:11111111 11111111 11111111 11111011,
逐位進行邏輯與運算:00000000 00000000 00000000 00000000,即得到0.
實際應用:
可以把位元組轉換為整 數,-64&0xFF=192
也可以用八進制的形式,-64&0377=192
其實0xFF和0377都表示的是整數255
4、
^
按位異或:逐位進行邏輯異或運算,原理:11=0,10=1,01=1,00=0.
4^-5
:
4的二進制形式為:00000000 00000000 00000000 00000100,
-5的二進制形式為:11111111 11111111 11111111 11111011,
逐位進行邏輯異或運算:11111111 11111111 11111111 11111111,即得到-1.
實際應用:按位異或可以比較兩個數字是否相等,它利用 1^1 =0,0^0 =0的原理。 20^20==0
移位運算符
<<
:左移,丢棄最高位,0補最低位
>>
:右移,符号位不變,左邊補上符号位
>>>
:無符号右移,0補最高位
例子:
整數-3的二進制
原碼為 10000000 00000000 00000000 00000011
反碼為 11111111 11111111 11111111 11111100
補碼為 11111111 11111111 11111111 11111101
Java存儲的整數-3實際為補碼
1、左移3位 -3<<3
11111111 11111111 11111111 11111101 左移3位後為:
11111111 11111111 11111111 11101000 轉為原碼:
10000000 00000000 00000000 00011000 轉為整數:即-24
2、右移3位 -3>>3 ,
11111111 11111111 11111111 11111101右移3位後:
11111111 11111111 11111111 11111111 轉為原碼:
10000000 00000000 00000000 00000001 轉為整數:即為-1
3、無符号右移3位, -3>>>3
11111111 11111111 11111111 11111101 無符号右移3位為
00011111 11111111 11111111 11111111
由于無符号右移之後為正數,正數的補碼和原碼是一緻的,是以 -3>>>3的值即為:
00011111 11111111 11111111 11111111
轉成整數輸出為:
0*2^31+0*2^30+0*2^29+1*2^28+1*2^27+.....+1*2^1+1*2^0=536870911
PS: 對char,byte或者short進行移位處理,那麼在移位進行之前,它們會自動轉換成一個int。隻有右側的低5位(32)才會有用。這樣可防止我們在一個int數裡移動不切實際的位數。若對一個long值進行處理,最後得到的結果也是long。此時隻會用到右側的6個低位(64),防止移動超過long值裡現成的位數。
byte(1位元組)、short(2位元組)、char(2位元組)做移位運算之前,會被自動轉換為int類型,然後再進行運算。
byte(1位元組)、short(2位元組)、char(2位元組)類型的資料經過移位運算後結果都為int型。
long(8位元組)經過移位運算後結果為long型。
在左移位(<<)運算時,如果要移位的位數大于被操作數對應資料類型所能表示的最大位數,那麼先将要求移位數對該類型所能表示的最大位數求餘後,再将被操作數移位所得餘數對應的數值,效果不變。
比如
1<<35 = 1<<(35%32) = 1<<3 = 8
對于有符号右移位(>>)運算和無符号右移位(>>>)運算,當要移位的位數大于被操作數對應資料類型所能表示的最大位數時,那麼先将要求移位數對該類型所能表示的最大位數求餘後,再将被操作數移位所得餘數對應的數值,效果不變。
比如
100>>35 = 100>>(35%32) = 100>>3 = 12
float(4位元組)移位沒有實用意義,因為浮點數的位數有好幾種不同含義(一般根據IEEE754标準)
符号位(1位)+ 指數位(8位)+ 尾數(23位)= 32位