進製轉換應用 劍指offer題型歸納

2021-10-23 16:11:52 字數 1413 閱讀 9347

1.按位與&

相同位的數字只要有0則位0

2.按位或|

相同位的數字只要有1則位1

3.按位異或^

相同位的數字不同則為1****相同則為0

4.左移<<

將運算數的二進位制整體左移指定位數,低位用0補齊,將乙個數左移一位擴大2倍,以此類推。

5.右移》

將運算數的二進位制整體右移指定位數,高位用0補齊,將乙個數右移一位縮小2倍,以此類推。

輸入乙個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼表示。

寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。

本題考查位運算的應用,利用位運算實現兩個數的相加。

無進製和運算是每位異或結果

進製和運算是每位的結果左移一位,因為進製影響的是下一位的運算。

兩數之和實際上就是無進製+進製的結果。

演算法步驟

1.分別計算num1和num2的無進製和、進製和。

2.判斷進製和是否等於0,如果不等於0,則無進製和作為num1,進製和作為num2,繼續計算。

3.如果進製和為0,說明無需進製,則返回無進製和。

class

solution

return result;}}

;

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

根據位運算中異或的性質,我們把陣列中所有的數,依次異或運算,出現兩次的數字抵消了,最終的結果就是兩個只出現一次數字的異或。

這個結果二進位制中的1,代表兩個數字的不同位,我們取第乙個1所在的位,以該位是否為1為標準把陣列分為兩組。相同的數肯定在乙個組,而不同的數,肯定不在一組。最後每組依次異或,剩餘的兩個結果就是兩個只出現一次的數字。

那麼,如何找到第乙個1呢?假設第一次異或的結果為num,可以讓1從第0位開始依次左移,和num進行與運算,直到與運算的結果不為0,則說明該位為1。

也可以用num&(-num)找到。因為計算機用補碼訪問二進位制數,而負數的補碼為反碼+1,舉個例子:

假如ret = 1110 , -ret = 0010 , 所以 i = 0010

void

(vector<

int> data,

int* num1,

int*num2)

num&=(

-num)

;// int index=1;

// while((num&index)==0)

// for

(const

int i:data)

}

劍指offer 進製轉化

寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。思路 首先看十進位制是如何做的 5 7 12,三步走 第一步 相加各位的值,不算進製,得到2。第二步 計算進製值,得到10.如果這一步的進製值為0,那麼第一步得到的值就是最終結果。第三步 重複上述兩步,只是相加的值變成上述兩步的得到的...

進製轉換題型總結

01 數制轉換 思路 以十進位制為跳板,實現低位數 換成十進位制後資料在long long以內 的進製轉換 a b進製模板 0 include using namespace std int a,b,num 10 0 char str 40 ans 40 int main 10進製轉換為b進製 取餘...

劍指ofer題型歸類

51.構建乘積陣列 考察知識點 左階乘 右階乘 52.正規表示式匹配 考察知識點 dfs 分類討論 往前探測 53.表示數值的字串 考察知識點 分類討論 54.字元流中第乙個不重複的字元 考察知識點 map 佇列 55.鍊錶中環的入口節點 考察知識點 快慢指標 56.刪除鍊錶中重複的結點 考察知識點...