負數的位運算問題

2021-09-16 18:47:55 字數 736 閱讀 5610

原碼、反碼和補碼

乙個數可以分成符號位(0正1負)+ 真值,原碼是我們正常想法寫出來的二進位制。由於計算機只能做加法,負數用單純的二進位制原碼書寫會出錯,於是大家發明了反碼(正數不變,負數符號位不變,真值部分取反);再後來由於+0, -0的爭端,於是改進反碼,變成補碼(正數不變,負數符號位不變,真值部分取反,然後+1)。二進位制前面的0都可以省略,所以總結來說:計算機裡的負數都是用補碼(符號位1,真值部分取反+1)表示的

位運算和無符號位運算

對於負數而言,普通位運算已然保持了符號位1,而是將真值部分進行位運算。但要注意對於負數的位運算操作是建立在補碼上的(補碼運算,得到補碼結果,將補碼結果轉換為普通的10進製數結果),所以就會出現-15 >> 1 得到的是-8 而不是 -7.而無符號位運算則是將負數的補碼整個一起位移,並且高位補0,這就意味著將高位符號位補0變成了正數,所以最後往往得到乙個很大的值,即integer.max_value - x.x為該負數的絕對值進行位運算後得到的結果。

大數(long 64,int 32)向小數(short 16,byte 8)的溢位問題

直接進行位運算,預設輸出值的型別為int.short, byte等小數將會自動擴充成int進行位運算,long則使用64位位運算。如果強制大數向小數轉換,就會出現溢位,原大數真值中的1變成了小數里代表符號位的1而成為了負數。

最後就是位運算在刷題裡遇到的不多,有時候那種純數字的問題不能用乘法除法的話就可以考慮位運算了。

關於負數與位運算

劍指offer上的一道原題,鑽了個牛角尖 求二進位制中1的個數 問題出現在負數,因為要保持負數的性質,所以對負數進行右移操作後將在首位重新補1,若干次右移後將變為0xffffffff.如果要去掉負數的符號位,可以考慮用 int a 127 a a 0x80000000 0x80000000就是32位...

負數的或運算

場景 有乙個函式的返回值是乙個狀態量,我希望用這個狀態量的每一位來表示一種狀態的t f。迫於強迫症,這個返回的值應該是負數的。所以一開始我大概是這樣寫的 if if yyy if zzz 但是這個結果一直是 1。原來以為負數的或運算和正數的或運算是一樣的,1 2 3這樣的。後來想了下,因為在計算機裡...

按位異或運算 (正數異或負數)

正數反碼 與原碼相同 負數反碼 符號位為 1 數值位按位 取反。正數補碼 與原碼相同 負數補碼 求反加一 記住 所有參與運算的都是以補碼形式進行的 結果也是補碼 因此也需要將補碼轉換成為原碼的形式存在 下面就以乙個例子進行講解 負二 異或 三等於多少?2 3 那麼怎麼轉換成位補碼呢?1.如果是負數的...