最近在看go,遇到一個問題:
一時沒看明白一元運算的異或運算是如何得到結果值的,代碼如下:
var b uint8 = 15 var c int8 = 15 fmt.Printf(" b: %08b \n", b) fmt.Printf("^b: %08b \n", ^b) fmt.Printf(" c: %08b \n", c) fmt.Printf("^c: %08b \n", ^c) // 執行結果 b: 00001111 ^b: 11110000 c: 00001111 ^c: -0010000
按位補足 ^ : 該運算符與異或運算符一同使用,即 m^x,對於無符號x使用“全部位設置為1”,對於有符號x 時使用 m=-1 。
看上面的代碼,和解釋,對於無符號數值的運算比較好理解:
^15
等價於 1111 1111 ^ 0000 1111
結果: 1111 0000
但對於有符號數是如何計算出 -0010000 的呢?先上計算過程
^15
等價於 -1^15
等價於 1000 0001 ^ 0000 1111 (這里是原碼)
等價於 1111 1111 ^ 0000 1111 (這里是補碼)
結果 1111 0000 (這里是補碼)
結果轉為原碼 1000 1111 (補碼) +1 --> 1001 000 (原碼)
涉及的概念:
原碼、反碼、補碼,及轉換過程
真值:符號位+數字的絕對值 就是真值:例如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
這里還有一個概念:就是在系統中,數值使用補碼來表示(存儲)
原因:可以看這里 https://zhuanlan.zhihu.com/p/91967268
由補碼求原碼
- 如果補碼的符號位為“0”,表示為正數,所以補碼就是該數的原碼。
- 如果補碼的符號位為“1”,表示為負數,求原碼的操作是:符號位不變,即為1,其余各位取反,然后再整個數加1
示例
1111 0000 -> 1000 1111 ->1000 1111 + 1 -> 1001 0000
反碼通常是用來做 原碼和補碼轉碼的過渡。
其實是很基礎的知識,但是多年沒接觸過,導致忘光了
如果想復習的話,可以看一下這里
原碼、反碼、補碼 詳解!不懂的請看過來!
https://www.cnblogs.com/resn/p/13396630.html