2 回答

TA貢獻1828條經驗 獲得超6個贊
該^
運算符是按位補碼運算符。規范:算術運算符:
對于整數操作數,一元運算符
+
、-
和^
定義如下:
+x is 0 + x
-x negation is 0 - x
^x bitwise complement is m ^ x with m = "all bits set to 1" for unsigned x
and m = -1 for signed x
所以1
在二進制中是單個 1 位前面全是零:
0000000000000000000000000000000000000000000000000000000000000001
所以按位補碼是一個單獨的 0 位,前面是全 1:
1111111111111111111111111111111111111111111111111111111111111110
The^1
是一個無類型常量表達式。當它被傳遞給一個函數時,它必須被轉換為一個類型。由于1
是無類型整型常量int
,因此將使用其默認類型。int
在 Go 中使用2 的補碼表示,其中負數以 a 開頭1
。完整的數字是-1
,數字小一(二進制)是-2
等等。
上面的位模式是 的 2 的補碼表示-2
。
要打印位模式和類型,請使用以下代碼:
fmt.Println(^1)
fmt.Printf("%T\n", ^1)
fmt.Printf("%064b\n", 1)
i := ^1
fmt.Printf("%064b\n", uint(i))
它輸出(在Go Playground上試試):
-2
int
0000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111111111111111111111111110

TA貢獻1784條經驗 獲得超2個贊
好的,這與我們在計算中使用符號的方式有關。
對于一個 1 字節的數字,你可以得到
丁 乙
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
你可以在這里看到 1 等于 0001(沒有變化)但 -1 等于 1111。^運算符執行按位異或運算。所以:
0001
1111 xor
-------
1110 -> That is actually -2.
所有這一切都是因為我們用來計算負數的兩個補碼的約定。當然,這可以外推到更長的二進制數。
您可以使用 Windows 計算器進行異或按位計算來對此進行測試。
- 2 回答
- 0 關注
- 199 瀏覽
添加回答
舉報