5.5 Write a function to determine the number of bits required to convert integer A to integer B.
EXAMPLE
Input: 31,14
Output: 2
這道題給了我們兩個數字A和B,問如果將A轉化為B需要變幾個位,那麼我們很容易想到要用異或來做,因為相同位異或為0,那麼為1的為就是不相同的位,總和就是我們要求的結果。那麼此題就轉化為求異或結果中位‘1’的個數,我們可以用for迴圈來做,判斷異或數的最低位是否為1,若為1就計數器加1,然後將異或數向右移動一位,以此類推直至異或數為0,參見程式碼如下:
解法一:
class Solution { public: int bitConvertNumber(int a, int b) { int res = 0; for (int c = a ^ b; c != 0; c >>= 1) { res += c & 1; } return res; } };
還有一種方法,這裡不是將異或數每次向右移動一位,而是用n&(n-1)來清楚最低有效位Least Significant Bit,每清除一個,計數器增1,直到異或數為0停止,參見程式碼如下:
解法二:
class Solution { public: int bitConvertNumber(int a, int b) { int res = 0; for (int c = a ^ b; c != 0; c &= c - 1) { ++res; } return res; } };
Tips:根據之前那篇Single Number III 單獨的數字之三,我們知道得到最低有效位Least Significant Bit的方法是n&(-n),而這道題又學習了清除最低有效位Least Significant Bit的方法是n&(n-1),這些小技巧需要我們深刻理解,並在今後的解題中靈活的使用,這才是刷題的精髓所在。。。