學懂模運算 負數的補碼為什麼要按位取反再加一

列隊貓發表於2020-10-07

模運算和負數的補碼為什麼要按位取反再加一

模運算

模運算概念:在一個模運算系統中,一個數與它除以“模”後的餘數等價

作用:實現+ 和– 的統一,實現數值運算時使用同一的符號

例如:模12系統時鐘
  假定鐘錶時針指向10點,要將它撥向6點, 則有兩種撥法:
    ① 倒撥4格:10- 4 = 6
    ② 順撥8格:10+8 = 18

  即模運算:8是- 4對模12的補碼,- 4的模12補碼等於8
    10- 4 ≡ 10+8 (mod 12)
    - 4 ≡ 8 (mod 12)

概念解析(非常重要)

  1. 模運算實際上就相當與一個一元一次函式,如:1+x=0,求x=?,答:x=0-1 即-1,這個一元一次函式中0就是模,就相當於- 4 ≡ 8 (mod 12)中的12,1和-1就相當於- 4 ≡ 8 (mod 12)中-4和8

  2. 至於為什麼,因為“溢位”,就像鐘錶只有12個點,就相當與一個12進位制數,而儲存這個數的空間只有一位,當超過12點後,時間就放生了“溢位”,可顯示的數值就變成了0,那麼指向10點的鐘表,要將它撥向6點,如果這麼看10-x=0,求x,答:x=-4或+8,-4可以理解往後面撥四個小時就行了,+8呢,10點往前撥8個小時,10+8=18,但是模12系統中最大的數位為12,18超過了12發生了溢位,自然就變成6了

  3. 換算到計算機系統中的二進位制資料,1+x=0,求x=?由於需要表示符號位就變成了,00000001+x=00000000,裡面的x就應該代替 -1的二進位制編碼才對,這樣,我們得到 x=11111111,而11111111就是-1,所以稱11111111為-1的補碼

  4. 我們常理解為補碼就是負數“按位取反,末尾加一”,我們知道模就是R位模系統中的基數,如:1-1=0,如-1=0-(+1),即二進位制的1000000001=0000000000-0000000001,即1000000001=(1111111111-0000000001)+0000000001,正是負數的按位取反,末尾加一

結論

  一個負數的補碼等於模減該負數的絕對值
    1000000001(-1)=0000000000-0000000001(1)

  對於某一確定的模,某數減去小於模的另一數,總可以用該數加上另一數負數的補碼來代替

相關文章