1. 程式人生 > >Lintcode181——將整數A轉換為B

Lintcode181——將整數A轉換為B

題目描述

描述
如果要將整數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;
    }
};