移位操作和二進位制知識

2021-09-06 23:34:16 字數 2063 閱讀 2188

常用的移位操作是<< 和 >> ,分別為左移和右移。我們在c語言中有算數移位和邏輯移位兩種。

算數移位:區分符號的移位      

邏輯移位:不區分符號的移位  

算數移位和邏輯移位有什麼不同,舉例說明,例如:

(1)對無符號數3來說:

x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成00000110,所以結果是6;[1*2^2 + 1*2^1 + 0*2^0 = 6]

x>>1往右邊移一位,由於是無符號數,所以邏輯右移,最右邊一位移掉,最左邊移進來的位補零,變成00000001,所以結果是1。[1*2^0 = 1]

(2)對於有符號數3來說:

x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成00000110,所以結果是6;

x>>1往右邊移一位,由於是有符號數,可能發生邏輯右移,也可能發生算術右移,這一點,c標準並沒有明確地指定是使用邏輯右移還是算術右移。但大多數的機器都使用算術右移,變成00000001,所以結果還是1。

但是請注意,這只是說大多數的機器是這樣的,你敢保證自己不會碰到特殊情況嗎?

(3)對於有符號數-3來說:

x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成11111010,結果是-6;[-(1*2^2 + 0*2^1 + 1*2^0 +1) = -6]

x>>1往右移一位,由於是有符號數,可能發生邏輯右移,也可能發生算術右移。大多數機器使用算術右移,變成11111110,結果是-2。[-(1*2^0 +1) = -2]

總結:

左移時總是移位和補零;

右移時無符號數是移位和補零,此時稱為邏輯右移;

而有符號數大多數情況下是移位和補最左邊的位(也就是補最高有效位),移幾位就補幾位,此時稱為算術右移。

補充:

1.組合語言中的邏輯右移(shr)是將各位依次右移指定位數,然後在左側補0,算術右移(sar)是將各位依次右移指定位數,然後在左側用原符號位補齊

2.高階語言右移運算子(>>)是將乙個數的二進位全部右移若干位,低位移出部分捨棄,左補0

3.高階語言右移和組合語言中的邏輯右移功能一樣,但不同於算術右移

理解有誤的認知:對於有符號整型數的簡單認識就是:最高位為符號位,0為正,1為負。那麼剩下幾位應該如何表示呢?理所當然的認為:既然是1表示為0000 0001(假設為8位整型數,下同),那麼-1就應該表示為1000 0001了。

實際上在c語言裡,-1的正確表示應該是1111 1111,即0xff。因為c語言裡,對整型數是採用two』s complement表示法,而前面我的理解則是sign-magnitude表示法(浮點數採用該法)。在two』s complement表示法裡,1000 0001表示的是-127。

幾個特殊值,比如:

正值的最大表示為0111 1111,即127。[1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 +1*2^0 = 127]

負值的最小表示為1000 0000,即-128。[-(1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 +1*2^0 + 1) = -128]

並因此帶來幾個有趣的現象,比如從8位有符號數轉成16位有符號數的填充問題。以前想當然的是填0,但這是錯的,應該是填充符號位的值。比如-1=0xff填充符號位1就應該變成0xffff。而如果填充的是0,那麼變成0x80ff就不對了。

two』s complement是不對稱的。乙個數的正負值表示,除了最高位之外,其餘位數也是不盡相同的。在c語言裡,當在無符號數和有符號數之間進行轉換的時候,數值的二進位制序列是不會改變的,改變的只是對該序列的解讀模式。比如有符號數-1轉換成無符號數就變成了255,雖然其二進位制表示都是0xff。如果不理解這一點,就會出bug。

python二進位制移位 python移位運算的實現

密碼演算法程式設計實踐選的sha 1。在寫的過程中遇到一丟丟關於python移位的問題,記錄一下。sha 1其中第一步需要填充訊息。簡單闡述一下sha1填充訊息的過程 如輸入訊息 123 先轉成ascii碼 313233,訊息長度為3 8 24。即00110001 00110010 00110011...

Python 二進位制移位操作學習總結

python 二進位制向左移位操作符 移位前的數值 移位次數 說明 移位數值的二進位制末尾新增0,移位幾次就新增幾個0 例項 print bin 4 結果 0b100 print bin 8 結果 0b1000 將4的二進位制向左移位一次即末尾新增乙個0 print 4 1 結果 8python 二...

二進位制操作

關於二進位制操作很常見,很多筆試面試題中也有涉及,本篇主要圍繞二進位制翻轉,二進位制最高位判定和給定整數的二進位制輸出來 靈活使用二進位制的 操作。一 給定整數的二進位制翻轉 思路 可以考慮逐次翻轉得到最終的翻轉結果,具體做法,首先將所有二進位制位奇偶位逐個翻轉,然後以兩位為一對 作為整體 奇偶對逐...