Lintcode181——將整數A轉換為B
阿新 • • 發佈:2018-11-21
題目描述
描述
如果要將整數A轉換為B,需要改變多少個bit位?
Both n and m are 32-bit integers.
您在真實的面試中是否遇到過這個題?
樣例
如把31轉換為14,需要改變2個bit位。
(31)10=(11111)2
(14)10=(01110)2
初始思路
兩個數異或之後得到數t(例如樣例中t為10001)
問題轉換為判斷t中有多少個1
可以通過移位運算來判斷,方法如下:
設定一個flag為1,判斷flag&t是否為1,為1則認為當前位是1,然後將t右移1位並判斷t是否為0,不為0則繼續while迴圈
出現的問題和原因
可以發現,如果是右移t,則當t是負數的時候,左邊為補符號位,即補1,導致了while迴圈無法終止。回顧一下移位運算子
移位運算子
移位運算子有雙目移位運算子:<<(左移)和>>(右移)。左移運算是將一個二進位制位的運算元按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。右移運算是將一個二進位制位的運算元按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。
解決辦法
我們不右移t而是左移flag,並由flag是否為0來終止while迴圈。
//提交通過 class Solution { public: /** * @param a: An integer * @param b: An integer * @return: An integer */ int bitSwapRequired(int a, int b) { // write your code here int t = a^b;//異或得到t,然後判斷t中有幾個1 int flag = 1; int count = 0;//需要改變的bit數量 while(flag!=0){ if((t&flag)!= 0){ count++; } flag<<=1; } return count; } };