位運算筆記

2021-09-25 07:39:28 字數 1605 閱讀 3858

需要掌握的知識:

原碼、反碼、補碼

原碼:是最簡單的機器數表示法。用最高位表示符號位,『1』表示負號,『0』表示正號。其他位存放該數的二進位制的絕對值。

1010 : 最高位為『1』,表示這是乙個負數,其他三位為『010』,

即(0* 2^2)+(1* 2^1)+(0* 20)=2(『』表示冪運算子)

所以1010表示十進位制數(-2)。

面臨問題:原碼下,正數相加所得結果正確,但是正數和負數相加出錯。

反碼:正數的反碼還是等於原碼,負數的反碼就是他的原碼除符號位外,按位取反。

3是正數,反碼與原碼相同,則可以表示為0011

-3的原碼是1011,符號位保持不變,低三位(011)按位取反得(100)

所以-3的反碼為1100

面臨問題:正數相加所得結果正確,正負相加所得結果正確,負負相加結果出錯。

補碼:正數的補碼等於他的原碼,負數的補碼等於反碼+1。

上述給出的是補碼的求法,補碼的真正定義是什麼?為什麼要這樣定義?

採用補碼的表示方式的好處,一是可以將減法轉化為加法運算,簡化運算複雜度;二是可以讓符號位作為數值直接參與運算,所得結果仍然是正確的,即符號位無需單獨處理。

按位或、與、異或、非

在c語言中,是將乙個十進位制整數(一般情況下)轉化為二進位制位,然後再對二進位制數的每一位對應進行或、與、異或、非操作。

位移運算

位移運算分為左移和算數右移,其中左移是指在二進位制表示下把所有位數字同時向左移動一位,高位越界後捨棄,低位以0補充。其中越界是指,int型變數一般僅有32位,如果左移後超過了32位則捨棄超過的部分。

算數右移是指在二進位制補碼表示下把數字同時向右移動,高位以符號位填充,低位越界後捨棄。算數右移等於除以2向下取整,(-5)>>1 = -3 , 3 >> 1 = 2。

可以發現算數右移並不等同於c語言中的整數/2,值得一提的是c語言中的整數/2是「除以2向0取整」。

邏輯右移是在補碼表示下把所有數字同時右移,高位以0補充,低位越界後捨棄,但是c++沒有規定實現方式,一般編譯器都會實現算數右移。

lowbit的實現

定義:lowbit( n )是取出非負整數 n 在二進位制表示下最低位的 1 以及它後面的0所構成的十進位制數值。

實現:

若 n > 0,且第 k 位是1,第 0 ~ k-1 位都是0。

先將n按位取反,那麼第 k 位變成了0,第 0 ~k 位變成了1。

再令n = n+1,那麼顯然通過一系列進製,第 0~k-1 位都變成了0,而第 k 位又變成了1。

我們注意到,最初的 n ,與最終的n只有第 0~k 位相同,更高的位都恰好相反(舉個例子推導試試),於是將它們按位與就得到了 0~k 位的數值,這個值就是我們所求的答案。

運算子優先順序

位運算筆記

10 1010 12 1100 與例如 以下按位比較,當兩個同時為1則為1,否則為0 10 1010 12 1100 結果為 8 1000 或例如 以下按位比較,當兩個有任何乙個為1則為1,否則為0 10 1010 12 1100 結果為 14 1110 非例如 以下按位比較,當兩個數不同時則為1否...

筆記 位運算

1 格式 x y 2 規則 對應位均為1時才為1,否則為0。例如,3 9 1 0011 1001 0001 3 主要用途 取 或保留 1個數的某些位,其餘各位置0。1 格式 x y 2 規則 對應位均為0時才為0,否則為1 3 9 11。例如,3 9 11 0011 1001 1011 3 主要用途...

位運算 筆記

這幾天擼了一下位運算。寫個筆記總結一下。首先運算了解一下。按位與 按位或 按位異或 取反 左移 右移 這一題,我們本來可以不停除2,看最後是否等於1 但是掌握了上面我們說的思想以後。就直接簡單了。只需要兩行 class solution 因為如果是2的冪 那麼它的二進位制必定只有乙個1.去掉了最後乙...