位运算:
优先级8-10等 次于等于判断符和加减运算,优于逻辑与非
一.按位与运算
符号表示: “&”
运算过程:
① 将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)
② 每一位都进行如下运算:
a) 1与1与运算得1
b) 1与0(0与1)与运算得0
c) 0与0与运算得0
两个数按位进行或运算特点有:
1. 多个相同数进行与运算等于其本身
2. 多个数进行按位与运算结果小于等于其中最小值
3. 左结合性
4. 优先级在位运算中最高。
样例:
1&1 = 1
1&2 = 0
1&2&1 = 0
代码示范:
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int a; scanf("%d", &a); int temp = a;//注意这里直接把第一个数作为初值 for (int i = 1; i < n; ++i) { scanf("%d", &a); temp = temp & a; } printf("%d\n", temp); } return 0; }
特殊应用:1&n 对于n为偶数结果是0,n为奇数结果是1,可用于判断奇偶。
二.按位或运算
符号表示: “|”
运算过程:
③ 将数转化为二进制(实际机器操作中本身就是二进制,这里的意思是人工计算)
④ 每一位都进行如下运算:
a) 1与1或运算得1
b) 1与0(0与1)或运算得1
c) 0与0或运算得0
两个数按位进行或运算特点有:
5. 多个相同数进行或运算等于其本身
6. 多个数进行按位或运算结果大于等于其中最大值
7. 左结合性
8. 优先级低于按位异或和按位与。
样例:
1|1 = 0
1|2 = 3
2|2 = 2
1|1|1 = 1
1|2|1 = 3
代码示范:
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int temp = 0;
int a;
for (int i = 0; i < n; ++i) {
scanf("%d", &a);
temp = temp | a;
}
printf("%d\n", temp);
}
return 0;
}
三.非运算
表示方法: “~” (键盘左上角)
运算法则为:
a) 1按位非为0
b) 0按位非为1
大小不一定,优于按位或,次于按位与
样例(二进制):
~1 = 0
~0=1
~10010=01101
样例(64位int型):
~1 = -2
~2 = -3
~-1 = 0
~0 = -1
注: int中第一位为符号位,以补码形式保存,0比较特殊它的补码的二进制为1000,0000,0000,0000所以会产生这种结果。
代码示范:
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) != EOF) {
printf("%d\n", ~n);
}
return 0;
}
四.按位异或
符号表示: “^”
运算法则:
① 每位转换为二进制
② 每一位都进行如下运算:
a) 0 ^ 0 = 0
b) 0 ^ 1 = 1
c) 1 ^ 0 = 1
d) 1 ^ 1 = 0
特点
1. 对偶数个相同数字进行按位异或运算得到0
2. 对奇数个相同数字进行按位异或运算得到1
3. 对两个不同数字进行运算相当于加号
4. 对多个不同数字结果无规律
5. 左结合性
样例:
1 ^ 2 = 3
1 ^ 1 = 0
1 ^ 1 ^ 1 = 1
2 ^ 2 ^ 2 = 2
1 ^ 2 ^ 3 = 0
示例代码:
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int a; scanf("%d", &a); int temp = a; for (int i = 1; i < n; ++i) { scanf("%d", &a); temp = temp ^ a; } printf("%d\n", temp); } return 0; }