对于位运算的一些例题下的该如何使用

来源:互联网 发布:信息工程研究所 知乎 编辑:程序博客网 时间:2024/06/16 07:46

第一个问题:

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 
输入例子:
1999 2299
输出例子:7

这个例子我一开始并不知道该如何进行运算,在看了一些资料以后才明白自己并没有掌握位运算的技巧

#include <stdio.h>int main(){int m = 5;int n = 7;int a = m^n;  // m^n以后就把他们两个不同的位变成了1,只要算出里面有多少个1就可以得到他们两个有多少个不同位;int num = 0;while(a > 0){a &= ( a - 1); //这个表达式是把右面的1去掉,直到全部为0的时候就是不同位的个数;num++;}printf("%d\n",num);system("pause");return 0;
  大家都知道异或在运算的时候,是同为1,不同为0,由题目可以知道,求得是不同的位数,所以进行异或运算就可以得到异或的结果有多少个1,求出医德个数就是他们连个有多少个不同位;在位运算中 a &=  (a-1) 就相当于 a = a&(a-1),这个公式就是把a的二进制数去掉最右边的1;所以就可以得到我们想要的答案了;

第二个例子:

一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
如:
数据:1 3 5 7 1 3 5 这组数据中,只有7出现了一次。
结构:找到的数就是:7.

#include <stdio.h>  #define N 8int main() {  int arr[N];  int i,j;  int len=sizeof(arr)/sizeof(arr[0]);  for(i=0;i<len;i++)        {  scanf("%d",&arr[i]);  }    for(i=1;i<len;i++)  {     arr[0] = arr[0]^arr[i];    } printf("%u\n",arr[0]);system("pause"); return 0;  } 

 直接用上面问题的例子来解释这个问题,说一下这个怎么算:

  当输入1,3,5,7,1,3,5这7个数的时候,因为在位运算符异或当中((a^b)^a) = b,所以在这个/数组中从头到尾((((((1^3)^5)^7)^1)^3)^5)全部异或一次得到的结果就是就是只有一个的那个数;



0 0
原创粉丝点击