位运算—-异或
来源:互联网 发布:电脑nvs恢复软件 编辑:程序博客网 时间:2024/09/21 09:00
异或运算通常用于对二进制的特定一位进行取反操作。
运算规律:
①a^b^c==a^(b^c)==(a^b)^c;
②d=a^b^c ==> a=b^c^d;
③a^a==0;
④x^0==x,1^num==~num;
1、交换a,b的值:
a^=b,b^=a,a^=b;
2、判断a、b是否相等:
if(a^b==0)printf("相等\n");else printf("不相等\n");
3、有n个数,其中只有一个数出现奇数次,找出这个数。
根据前面的运算规律,一个数a异或偶数个b,相当于没有进行异或操作,答案仍为a。
对于这道题,我们可以直接将n个数依次异或,最终剩下的就是出现奇数次的数。
代码:
#include<cstdio>#include<cctype>#include<cstring>using namespace std;void redirect(){ freopen("odd1.in","r",stdin); freopen("odd1.out","w",stdout);}inline int getin(){ int ans=0;char tmp; while(!isdigit(tmp=getchar())); do ans=(ans<<3)+(ans<<1)+tmp-'0'; while(isdigit(tmp=getchar())); return ans;}void work(){ int n,i,j,k,ans=0; n=getin(); for(i=1;i<=n;i++)k=getin(),ans^=k; printf("%d\n",ans); }int main(){ redirect(); work(); return 0;}
4.n个数,只有两个数出现奇数次,找出这两个数。
这道题,首先想一下能否把它转化为第三问的类型呢?
设这两个数为a,b,将n个数依次异或得到 x,那么有 x==a^b。若x的右起第k个二进制位为1,那么对应a、b的的二进制位中必有一个为1,另一个为0。根据这个将n个数分为两个部分,右起第k位为1的分在第一组,为0的分在第二组。假设数a在第一组,那么可以得到,在第一组中,只有数a出现奇数次, 同样的,在第二组中,只有数b出现奇数次。
这样,我们就把第四问转变成第三问了。
代码:
#include<cstdio>#include<cstring>#include<cctype>#include<algorithm>#define maxn 100000using namespace std;int a[maxn+100];void redirect(){ freopen("odd2.in","r",stdin); freopen("odd2.out","w",stdout);}inline int getin(){ int ans=0;char tmp; while(!isdigit(tmp=getchar())); do ans=(ans<<3)+(ans<<1)+tmp-'0'; while(isdigit(tmp=getchar())); return ans;}void write_ans(int x,int y){ if(x==0) { if(y!=0)printf("%d\n",y); else printf("%d\n",0); return; } printf("%d %d\n",x,y); }void work(){ int n,i,j,k,ans1,ans2,t,x=0; n=getin(); for(i=1;i<=n;i++)a[i]=getin(),x^=a[i]; t=x&(-x); //t是特征位,只保留x的右起第一个1,比如:x=101,那么t=001; ans1=0,ans2=0; for(i=1;i<=n;i++) if(t&a[i])ans1^=a[i];else ans2^=a[i]; if(ans1>ans2)swap(ans1,ans2); write_ans(ans1,ans2); }int main(){ redirect(); work(); return 0;}
0 0
- 位运算—-异或
- 位异或运算符
- 位运算中的异或运算
- 按位与、或、异或运算
- 按位与、或、异或运算
- 按位与,按位或,异或等运算
- 位运算总结(按位与,或,异或)
- 位运算符-按位与或非异或
- [codeforce]位运算——最大异或
- 关于位异或运算的妙用
- poj1753(位运算(异或)+ bfs)
- 异或最大--位运算--~非--zzuli1675
- 认识位运算中异或
- dlut1216-位运算(异或)水题
- 二进制和位运算中的异或
- C语言:位异或运算符
- C语言:位异或运算符^
- C语言位运算之异或 ^
- javascript函数querySelector
- cocos2d-x 安卓环境配置 -转
- Junit 跟XML解析实例
- Python学习笔记——print语句用法总结
- ThinkPHP 的模型使用详细介绍--模型的核心(七)
- 位运算—-异或
- SQL modify
- java Semaphore 通行证
- php论坛中常用的两个时间差(多少分钟前,多少小时前,多少天前)
- android 树形多选框,真正意义上的 树形多选框,和 web的样式 很类似
- Oracle数据库泵的备份与恢复
- NPAPI插件开发
- 图像基本处理算法的简单实现(三)
- 【 地图系列 】 世界地图和主要国家的 JSON 文件