1、题目
分享一道CVTE(广州视源电子科技股份有限公司)的面试笔试题:
世界上有两种人,一种懂二进制,一种不懂。那么你知道两个 int32 整数 m 和 n 的二进制表达,有多少个位(bit)不同么? 输入示例:1999 2299 输出示例:7
2、代码
#include <stdio.h>
int countBitDiff(int m, int n);
int main(void)
{
int m, n, count;
printf("请输入两个数:");
scanf("%d %d", &m, &n);
count = countBitDiff(m, n);
printf("%d与%d共有%dbit不同\n", m, n, count);
return 0;
}
int countBitDiff(int m, int n)
{
int temp = m^n; //异或运算后为1的位即为m,n不相同的位
int count = 0;
int len = sizeof(int)*8;
while ( len-- )
{
/* 从低位至高为寻找temp的位中1的个数 */
if ( temp & 0x01 )
{
count++;
}
temp >>= 1; //temp右移一位
}
return count;
}
题目要比较两个int32的整数的不同的bit有多少,首先想到C语言的按位异或运算:参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即: 0^0=0,1^0=1,0^1=1,1^1=0
。以上程序中,首先使用一个变量temp存储两个int32的整数m,n异或后的结果,再用temp的低位至高位和0x01做按位与运算,且前提条件是长度len为真。