天天看點

java中的編碼,按位操作符,移位運算符

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位