一、二進位制在運算中的說明
二進位制是逢 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,結果為 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
的時候不是用補碼,而是用原碼,其他運算不都是補碼嗎?前面也講到計算機的運算其實是補碼運算!