对于位运算的一些例题下的该如何使用
来源:互联网 发布:信息工程研究所 知乎 编辑:程序博客网 时间:2024/06/16 02:02
第一个问题:
两个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
- 对于位运算的一些例题下的该如何使用
- 自己对于 “位运算符” 的理解
- 位运算的一些技巧
- 一些有趣的位运算
- 位运算的一些用途
- 位运算的一些案例
- 位运算的一些总结
- 位运算的一些应用
- 位运算的一些总结
- 位运算的一些总结
- 一些常用的位运算 | & ^
- 位运算的一些算法
- 一些运算的位操作
- 位运算的一些注意事项
- 位运算的使用
- 位运算的使用
- 位运算异或的应用 例题来自广东工业大学OJ
- 位运算的一些运用的技巧。
- 使用CGLIB实现AOP功能与AOP概念解释
- 每天一个算法之fibonacci递归法优化
- 深度学习中的Attention模型介绍及其进展
- 【c++】访问控制
- Java设计模式之-建造者模式
- 对于位运算的一些例题下的该如何使用
- java变量,数据类型
- .NET pfx文件解析私钥和公钥
- 从上往下打印二叉树
- COBOL call C function
- 单链表基础
- Java-003-朝花夕拾
- 初次使用servlet写HelloWorld
- nginx反向代理和rewrite进行解决跨域问题、去掉url中的一部分字符串,通过nginx正则生成新的url