分析
两个数进行异或,得出的结果可以看出有几个位是不相同的(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;
}