原碼、反碼、補碼

zhangsen發表於2019-07-15

一、二進位制在運算中的說明

二進位制是逢 2 進位的進位制,0、1 是基本算符。

現代的電子計算機技術全部採用的是二進位制,因為它只使用 0、1 兩個數字符號,非常簡單方便,

易於用電子方式實現。計算機內部處理的資訊,都是採用二進位制數來表示的。二進位制(Binary)數用 0

和 1 兩個數字及其組合來表示任何數。進位規則是“逢 2 進 1”,數字 1 在不同的位上代表不同的值,按從右至左的次序,這個值以二倍遞增。

二、原碼、反碼、補碼

對於有符號的而言

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

1 =>   [0000 0001]

-1=>   [1000 0001]

正數的原碼、反碼、補碼都一樣

負數的反碼 = 它的原碼符號位不變,其他取反(0->1 , 1->0)

負數的補碼 = 它的反碼+1

 1 ==> 原碼 [0000 0001]   反碼[0000 0001]   補碼[0000 0001]

-1 ==> 原碼 [1000 0001]   反碼[1111 1110]   補碼[1111 1111]

0的反碼,補碼都是0

在計算機運算的時候,都是以補碼的方式來計算的

1+1   1-1 = 1+(-1)

三、位運算子

Golang 中有 3 個位運算

  1. 按位與&
  2. 按位或|
  3. 按位異或^

分別是”按位與&、按位或|、按位異或^,它們的運算規則是:

按位與& : 兩位全為1,結果為 1,否則為 0

按位或| : 兩位有一個為 1,結果為 1,否則為 0

按位異或 ^ : 兩位一個為 0,一個為 1,結果為 1,否則為 0

案例:

package main
import "fmt"
func main(){
    fmt.Println(2&3)//2
    fmt.Println(2|3)//3
    fmt.Println(2^3)//1
    fmt.Println(-2^3)//4
}

//2&3
//2的補碼 0000 0010
//3的補碼 0000 0011
//2&3     0000 0010 =>2
//2|3     0000 0011 =>3
//2^3     0000 0001 =>1

//-2^2
//-2的原碼 1000 0010
//-2的反碼 1111 1101
//-2的補碼 1111 1110

//2 的補碼  0000 0010

//-2^2
//-2的補碼 1111 1110
//2 的補碼 0000 0010
//-2^2     1111 1100 (補碼)
//-2^2     1111 1011 (反碼)
//-2^2     1000 0100  (原碼) => 4

為什麼-2^2的時候不是用補碼,而是用原碼,其他運算不都是補碼嗎?前面也講到計算機的運算其實是補碼運算!

相關文章