编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
这道题主要考察二进制的理解和对于位操作符的使用。
首先我们先来讲两个关键
按(二进制)异或(^)
相同为0,相异为1.
按(二进制)与(&)
全为1则为1,其他都是0.
首先我们随便用两个值
a:110101
b:001011
首先我们知道这两个二进制数不同的数有5.
首先我们先用a^b得到
c:111110
这里的c有多少个1就代表有多少个不同的数。
所以我们要想方法一次消去一个1,并且每一次都需要count++。
明显的我们这需要一个循环,直到c中没有1。
如何每一次消去一个1呢?
这里我们可以用到c&(c-1)
c:111110
c-1:111101
按位与后
c:111100
c-1:111011
按位与后
c:111000
c-1:110111
按位与后
c:110000
c-1:101111
按位与后
c:100000
c-1:011111
按位与后
c:000000
我们可以看到每一次,c在二进制位都减少了一个1.
具体代码实现:
int main()
{
int a = 0;
int b = 0;
int count = 0;
scanf("%d %d", &a, &b);
int c = a ^ b;
while (c)
{
count++;
c = c & (c - 1);
}
printf("%d", count);
return 0;
}
题,自己写不出来没关系。主要是一定要理解!!!
我自己就想不出来哈哈哈哈哈(手动狗头)