1,比较两个数中有多少个不同的位?
第一种方法:
分别取出两个数字的每一位,然后进行比较,不同计数器加一,可以统计出来。
int Diff_num_bit(int a, int b)//比较两个数不同位的个数
{
int temp1 = 0;
int temp2 = 0;
int count = 0;
for (int i = 0; i < 32; i++)
{
temp1 = a & 1;
a >>= 1;
for (int j = 0; j < 1; j++)
{
temp2 = b & 1;
b >>= 1;
}
if (temp1 != temp2)
{
count++;
}
}
return count;
}
第二种方法:利用位运算来进行统计。我们知道异或运算的运算规则是相同位结果是0,不同位结果是1。
例如
int a=3;//011
int b=4;//100
int c=a^b;//111--->>7
我们可以统计c里面有多少个1,结果便是a,b中不同位的个数。
int Diff_num_bit(int a, int b)//比较两个数不同位的个数
{
int temp = a^b;
int count = 0;
while (temp != 0)
{
count++;
temp = temp&(temp - 1);
}
return count;
}
可以看出位运算的巧妙运用可以将程序的时间复杂度和算法精简起来。
2,一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
上个问题中介绍了异或运算的规则,那么可以知道相同的数字异或运算的结果是0。所以可以利用这个特点来解决这个问题
int main()
{
int arr[] = {1,2,3,1,2,3,5};
int i = 0;
int ret = 0;
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
ret ^= arr[i];
}
printf("%d\n", ret);
return 0;
}
相同的数字异或运算后结果为0,那么剩余的那个单独的数字就是要找的。
3判断整数n是否为2的正整数幂
解释:2的正整数冪就是指 2,4,8,16,32,64,128,256,512,1024,2018………….等数字。
在位运算应用(1)中,求解一个数位1的个数时候用了n&(n-1)的方法。在此重新来看这个问题
通过上图可以发现2的i次幂的数字和这个数字减一所得数字做位与运算结果位0;
依次特点和结论可以得出下面的算法代码
int ispow(int n)
{
if ((!(n&(n - 1))) && n >1)
return 1;
else
return -1;
}