[Java教程]9.二進制,位運算,原碼,反碼,補碼

Java教程專欄:https://blog.csdn.net/qq_41806966/category_9929686.html

這一篇將會了解一下計算機底層,二進制.


目錄

 

二進制

二進制與十進制互相轉換

機器數和真值

原碼

反碼

補碼

爲什麼需要原碼補碼反碼?

位運算


二進制

什麼是二進制?

二進制是計算技術中廣泛採用的一種數制

我們通常使用的都是十進制,也就是逢 10 進 1,那麼二進制自然就是 逢 2 進 1.

十進制的每一位只能爲 0,1,2...9, 二進制的每一位 只能是 0 或 1,

 

計算機底層計算使用的是二進制(沒有學過二進制,數學比較差可能理解比較難)

也就是說,我們電腦裏的文件其實都是由一堆 0 和 1組成

二進制與十進制互相轉換

先列舉二進制與十進制的一些基本數字, 0 到 11(藉此瞭解一下二進制與十進制的關係)

十進制(逢10進1) 0 1 2 3 4 5 6 7 8 9 10 11
二進制(逢2進1) 0 1 10 11 100 101 110 111 1000 1001 1010 1011

十進制轉二進制 計算方法爲

例: 將 57 轉爲二進制

先計算

57 / 2 = 28 餘 1(2 * 28 = 56 相比 57 還剩下 1,1就是餘數)
28 / 2 = 14 餘 0(28 可以被 2整除)
14 / 2 = 7 餘 0
7 / 2 = 3 餘 1
3 / 2 = 1 餘 1
1 / 2 = 0 餘 1
所以 57 轉 2 進制的結果爲 111001(餘數,從下往上)

畫張圖就是這樣的

所以 57 的二進制表示形式爲 111001

二進制轉十進制

公式爲 從左到右,第一位乘二的 二進制位數-1次方(次方就是多少個2相乘) 加上 第二位*2的 二進制位數 - 2次方 一致到最後(乘2的0次方,0次方爲1)

例: 將 1101 轉爲十進制

(這裏的 ^ 代表次方)
1101(二進制) = 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0
=8 + 4 + 0 + 1
=13(十進制)

 

在瞭解了二進制後就好理解原碼,反碼,補碼了.

機器數和真值

機器數就是一個數在計算機中的二進制表示形式.機器數是帶符號的(使用最高位也就是數字最左邊的那個數作爲符號位)

計算機字長爲八位

例:

1的機器數表示爲 0000 0001

-1的機器數表示爲 1000 0001

真值就是符號位後的數值

原碼

原碼就是我們認識的二進制碼(沒有做任何操作的),也就是我們上面計算的二進制碼.

有符號的前提下,最高位爲符號位,其餘各位爲數值本身的絕對值,無符號就是數據的絕對值,計算機的原碼用於表示有符號整數中的正數,以及無符號整數

反碼

  • 正數:反碼與原碼相同
  • 負數:符號位爲1,其餘位對原碼取反
    • 例如 -2 的原碼爲 1000 0010
    • 反碼爲 1111 1101(0變1 1變0就是取反)

補碼

  • 正數:原碼,反碼,補碼相同
  • 負數:最高位爲1,其餘位爲原碼取反,在對整個數加一
    • 例如 -2 的反碼爲 1111 1101
      • 補碼爲 1111 1110(逢2進1)
    • 可以得出 反碼 = 補碼 - 1
  • 在計算機系統中,數值一律用補碼來表示(正數與原碼一樣可以理解爲按照原碼解析,負數都是補碼)

爲什麼需要原碼補碼反碼?

對於計算機來說,需要辨別符號位會讓計算機的基礎電路設計變得十分複雜.

於是就有了讓符號位也參與運算的想法(計算機中可以只有加法,沒有減法,因爲 1 - 1 等價於 1 + (-1)).

這樣,就讓計算機運算的設計變得更簡單了.

補碼減法可以按加法算 如果最高位(符號位)有進位,則進位被捨棄

補碼計算只需要一步 將二進制數值進行相加

原碼則需要三步 檢測符號 -比較絕對值的大小 -計算

補碼比原碼快三倍

位運算

什麼是位運算?

計算機對於二進制數據進行的運算都叫位運算(+,-,*,/這些也是位運算)

在 Java 中,擁有以下位運算符號.

符號 描述 運算規則
& 兩個位都爲1時,結果才爲1
| 兩個位其中有一個爲1,結果爲1
^ 異或 兩個位相同爲0,相異爲1
~ 取反 0變1,1變0
<< 左移 各二進位全部左移若干位,高位丟棄,低位補0
>> 右移 各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)

接下來用例子一一列舉結果

  • & 按位與(兩個數比較的時候,同一位都爲1時,結果才爲1,在鍵盤的上面小數字8的位置,要先按下shift)
    • 比如 2 和 1 進行 & 操作
    • 2 & 1 = ?
    • 2轉爲二進制爲 10,1轉爲二進制爲 01(爲了與2的二進制對其 加個0)
      • 10
      • 01
    • 同一位爲1結果爲1,否則爲0 所以結果爲
      • 00
    • 2 & 1 = 0
  • | 按位或(同一位只要有一個爲1,結果爲1,否則爲0,在鍵盤的反斜槓處,不同鍵盤位置不同...)
    • 2和1進行 | 操作
    • 2 | 1 = ?
      • 10
      • 01
    • 任意一位爲1,結果爲1
      • 11
    • 2 | 1 = 3
  • ^ 按位異或(同一位相同則爲0,不同爲1,鍵盤上方的數字鍵 6,要按shift)
    • 2 ^ 1 = ?
      • 10
      • 01
      • 11
    • 2 ^ 1 = 3
    • 結果與或相同?再來一個例子 3 ^ 3 = ?
      • 11
      • 11
      • 00
    • 3 ^ 3 = 0
  • ~ 按位取反(0 變 1,1 變 0,只針對一個數,在鍵盤的左上角 數字鍵一排的最左,要先按 shift)
    • ~3 (轉爲二進制 八位)
      • 0000 0011
    • 取反後
      • 1111 1100
    • ~3 = -4
  • << 左移(往左移指定位,空位填0,就是兩個小於號)
    • 1 << 1(1 往左移動 1 位)
      • 移動前
        • 1
      • 移動後
        • 10
    • 1 << 1 = 2
    • 可以通俗理解,左移1位就是乘以2,兩位就是乘以2*2,以此類推
  • >> 右移(往右移動指定位,空位填0,兩個大於號)
    • 1 >> 1 = 0
    • 4 >> 1
      • 移動前
        • 100
      • 移動後
        • 010
    • 4 >> 1 = 2
    • 可以理解爲,右移一位就是除以2,兩位就是除以2*2,以此類推
  • 左移右移操作比乘除快.

能用左移和右移替換乘法和除法儘量用左移右移.

勤學多練,就是學習技巧.

下一節我們將學習Java中的字符串.

請繼續關注此專欄.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章