位运算:计算机处理的数据都是使用二进制编码表示的,而位运算就是直接对数据在内存中的二进制位进行处理。(熟悉进制转换)
**注意:
1.位运算只可运用于整数,不可用于float或double型
2.逻辑右移符号在各种语言里不同,比如Java是>>>
3.位操作符的运算优先级比较低,尽量使用括号来确保运算顺序。比如1&i+1,会先执行i+1再执行&。
运算符号
含义 | C语言 |
---|---|
按位与 | & |
按位或 | | |
按位异或 | ^ |
按位取反 | ~ |
左移 | << |
右移 | >> |
运算说明
1.按位与: a&b,a and b
全一则一,否则为零
2.按位或:a|b,a or b
有一则一,否则为零
3.按位异或:a^b,a or b
不同则一,相同则零
4.按位取反:是零则一,是一则零
简单应用
- 判断奇偶
if(x&1==1)//判断x为奇数还是偶数
2.变量交换
int swap(int a,int b){
a^=b;
b^=a;
a^=b;}//不用借助任何变量
或者
int swap(int a,int b){
a = a + b;
b = a - b;
a = a - b;}//帮助提高程序阅读能力,不推荐使用
- 这里来一个异或的简单应用,话不多说,上题,贴代码。
#include<stdio.h>
int main(){
int n,x,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) ans^=i;
for(int i=1;i<n;i++){
scanf("%d",&x);
ans^=x;
}
printf("%d",ans);
return 0;
}
当然,还有其它解法,例如
#include<stdio.h>
int main(){
int x,n,a[10010]={0};
scanf("%d",&n);
for(int i=1;i<=;i++){
scanf("%d",&x);
a[x]++;
}
for(int i=0;i<=n;i++){
if(a[i]==0){
printf("%d",i);
return 0;
}
return 0;
}