【程序员面试金典】写一个函数,确定需要改变几个位,才能将整数A转为整数B

341 阅读1分钟

分析

两个数进行异或,得出的结果可以看出有几个位是不相同的(0和1的不同)。

 0010 0000
 1110 0000
----------- XOR
 1100 0000

可以看出有两个1,即两者要互为转换需要转变两个位。

那么剩下的问题就是如何计算这个异或结果中的 1 的个数。

计算一个二进制数中 1 的个数的快捷方法:a & (a - 1)

 a = 1100 0000
 a - 1 = 1011 1111
 
 a = a & (a - 1) = 1000 0000
 第一次与操作消除了一个低位 1。
 
 a - 1 = 0111 1111
                1000 0000
 a & (a - 1) =  0111 1111
                ---------
                0000 0000
第二次与操作消除了最后一个 1。

在 for 循环中记录循环到 0 的次数,即得出 1 的个数
 

Solution

public static int bitSwapRequired(int a, in b) {
    int count = 0;
    for(int c = a ^ b; c != 0; c & (c - 1)) {
        count ++;
    }
    return count;
}