Java位運算的簡單介紹及個人理解!


原碼,反碼和補碼

1:二進制的最高位是符號位(0表示正數,1表示負數)

2:正數的原碼,反碼補碼都一樣

3:負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)

4:負數的補碼等於它的反碼加1

5:0的反碼補碼都是0

6:在計算機運算的時候都是以補碼的方式進行運算的


例子 名稱 結果
$a & $b and(按位與) 將把$a和$b中都爲1的位設爲1
$a | $b or(按位或) 將把$a或者$b中爲1的位設爲1
$a ^ $b xor(按位異或) 將把$a和$b中不同的位設爲1
~$a not(按位取反) 將$a中爲0的位設爲1,反之亦然
$a << $b shift left(左移) 將$a中的位向左移動,$b次(每一次移動都表示”乘以2“)
$a >> $b shift right(右移) 將$a中的位向右移動,$b次(每一次移動都表示”除以2“)

and(按位與) :

5 & -2 = 4

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101


-2的原碼爲:10000000 00000000 00000000 00000010

-2的反碼爲:11111111 11111111 11111111 11111101  負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)

-2的補碼爲:11111111 11111111 11111111 11111110  負數的補碼等於它的反碼加1


按位與(將把$a和$b中都爲1的位設爲1)

5的補碼爲:00000000 00000000 00000000 00000101

-2的補碼爲:11111111 11111111 11111111 11111110

計算得到的補碼:00000000 00000000 00000000 00000100


計算得到的補碼:00000000 00000000 00000000 00000100  因爲符號位爲0表示正數,而正數的原碼反碼補碼都一樣

計算得到的反碼:00000000 00000000 00000000 00000100

計算得到的原碼:00000000 00000000 00000000 00000100


計算得到的原碼轉換爲十進制得到4,所以5 & -2 = 4


or(按位或):

5 | -2 = -1

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101


-2的原碼爲:10000000 00000000 00000000 00000010

-2的反碼爲:11111111 11111111 11111111 11111101  負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)

-2的補碼爲:11111111 11111111 11111111 11111110  負數的補碼等於它的反碼加1


按位或(將把$a或者$b中爲1的位設爲1)

5的補碼爲:00000000 00000000 00000000 00000101

-2的補碼爲:11111111 11111111 11111111 11111110

計算得到的補碼:11111111 11111111 11111111 11111111


計算得到的補碼:11111111 11111111 11111111 11111111  因爲符號位爲1表示負數

計算得到的反碼11111111 11111111 11111111 11111110  負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1

計算得到的原碼:10000000 00000000 00000000 00000001  負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)

計算得到的原碼轉換爲十進制得到1,然後最高位爲符號位,符號位爲1表示負數,所以得到-1,所以5 | -2 = -1


xor(按位異或):

5 ^ -2 = -5

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101


-2的原碼爲:10000000 00000000 00000000 00000010

-2的反碼爲:11111111 11111111 11111111 11111101  負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)

-2的補碼爲:11111111 11111111 11111111 11111110  負數的補碼等於它的反碼加1


按位異或(將把$a和$b中不同的位設爲1)

5的補碼爲:00000000 00000000 00000000 00000101

-2的補碼爲:11111111 11111111 11111111 11111110

計算得到的補碼:11111111 11111111 11111111 11111011


計算得到的補碼:11111111 11111111 11111111 11111011  因爲符號位爲1表示負數

計算得到的反碼:11111111 11111111 11111111 11111010  負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1

計算得到的原碼:10000000 00000000 00000000 00000101  負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)

將計算得到的原碼轉換爲十進制得到5,然後最高位爲符號位,符號位爲1表示負數,所以得到-5,所以5 ^ -2 = -5


not(按位取反):

~5 = -6

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101

按位取反(將$a中爲0的位設爲1,反之亦然)

5的補碼爲:00000000 00000000 00000000 00000101

計算得到的補碼:11111111 11111111 11111111 11111010


計算得到的補碼:11111111 11111111 11111111 11111010  因爲符號位爲1表示負數

計算得到的反碼:11111111 11111111 11111111 11111001  負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1

計算得到的原碼:10000000 00000000 00000000 00000110  負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)

將計算得到的原碼轉換爲十進制得到6,然後最高位爲符號位,符號位爲1表示負數,所以得到-6,所以~5 = -6


shift left(左移):

5 << 2 = 20

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101

左移(將$a中的位向左移動,$b次(每一次移動都表示”乘以2“))

5的補碼爲:00000000 00000000 00000000 00000101

計算得到的補碼:00000000 00000000 00000000 00010100  將5的補碼左移兩位,符號位不變,新增的用0表示


計算得到的補碼:00000000 00000000 00000000 00010100   因爲符號位爲0表示正數,正數的原碼,原碼反碼補碼都一樣

計算得到的反碼:00000000 00000000 00000000 00010100

計算得到的原碼:00000000 00000000 00000000 00010100

將計算得到的原碼轉換爲十進制得到20,然後最高位爲符號位,符號位爲0表示正數,所以得到20,所以5 << 2 = 20

shift right(右移):

5 >> 2 = 1

5的原碼爲:00000000 00000000 00000000 00000101  正數的原碼,原碼反碼補碼都一樣

5的反碼爲:00000000 00000000 00000000 00000101

5的補碼爲:00000000 00000000 00000000 00000101

右移(將$a中的位向右移動,$b次(每一次移動都表示”除以2“))

5的補碼爲:00000000 00000000 00000000 00000101

計算得到的補碼:00000000 00000000 00000000 00000001  將5的補碼右移兩位,符號位不變,新增的用0表示


計算得到的補碼:00000000 00000000 00000000 00000001   因爲符號位爲0表示正數,正數的原碼,原碼反碼補碼都一樣

計算得到的反碼:00000000 00000000 00000000 00000001

計算得到的原碼:00000000 00000000 00000000 00000001

將計算得到的原碼轉換爲十進制得到1,然後最高位爲符號位,符號位爲0表示正數,所以得到1,所以5 >> 2 = 1
發佈了41 篇原創文章 · 獲贊 39 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章