C语言——位运算
1.按位取反(二进制反码)~: ~运算符把二进制形式1改为0,0改为1; 例如:~(11110000)=00001111; 代码示例:
#include<stdio.h>
int main(void){
char a = 240;
char b = ~a;
printf("%d",b);
return 0;
}
输出结果:
2.按位与& 只有两个运算对象的二进制位都为1,结果才为1。或者可以说有一个是0,结果就为0 例如:(10010011)&(00111101)=00010001; 代码示例:
#include<stdio.h>
int main(void){
char a = 147;
char b = 61;
char c = a&b;
printf("%d",c);
return 0;
}
输出结果:
3.按位或| 只有两个运算对象的二进制位都为0,结果才为0。或者可以说有一个是1,结果就为1 例如:(00010011)|(00111101)=00111111; 代码示例:
#include<stdio.h>
int main(void){
char a = 19;
char b = 61;
char c = a|b;
printf("%d",c);
return 0;
}
输出结果:
4.按位异或^ 两个运算对象的二进制位相同,则运算结果为0,不相同则运算结果为1。 例如:(00010011)^(00111101)=00101110 代码示例:
#include<stdio.h>
int main(void){
char a = 19;
char b = 61;
char c = a^b;
printf("%d",c);
return 0;
}
输出结果:
5.移位运算符 ①左移<<: 将运算对象的二进制位每一位的值向左移动指定的位数,运算对象移出左末端位的值丢失,用0填充空出的位置。 例如:(01010010)<<2=(01001000) 代码示例:
#include<stdio.h>
int main(void){
char a = 82;
char b = a<<2;
printf("%d",b);
return 0;
}
输出结果:
②右移>>: 将运算对象的二进制位每一位的值向右移动指定的位数,运算对象移出右末端位的值丢失,用0填充空出的位置。 例如:(01010010)>>2=(00010100) 代码示例:
#include<stdio.h>
int main(void){
char a = 82;
char b = a>>2;
printf("%d",b);
return 0;
}
输出结果:
运用位运算解题实例: 在实验室中,H是最神秘的一个,在一次实验室聚会上,学长发送x(奇数)个礼物,每个人都得到了学长的礼物且都是偶数个,唯有H是奇数个,每个成员得到的礼物都有相同的编号,请找出H礼物的编号,(礼物编号不超过50) 输入 第一行:礼物的个数x 第二行:x个礼物的编号 输入样例1: 7 1 1 2 2 3 3 4 输出:4 输入样例2: 11 1 2 3 4 5 5 4 3 8 2 1 输出:8 利用位运算解决:
#include<stdio.h>
int main(void){
int n;
scanf("%d",&n);
int b = 0,a;int i;
for(i = 0;i<n;i++){
scanf("%d",&a);
b = a^b;
}
printf("%d",b);
return 0;
}
样例一运行结果:
样例二运算结果:
|