位运算
Ⅰ 位运算的定义
我们知道程序中的所有数据,都是以二进制的方式存储在计算机中的。位运算就是基于二进制的位进行的运算,直接对整数的二进制位进行操作。因此考虑位运算有两个锚点:二进制,补码。
注意:计算机中所有的运算都没有位运算快
Ⅱ 位运算的符号
C语言中有以下六种位运算:
- ~ : 按位取反(单目运算)
- & : 按位与
- | : 按位或
- ^ : 按位异或
- << : 左移
- >> : 右移
Ⅲ 位运算的验证及分析
a.按位取反 ~
以下为测试代码:👇
#include <stdio.h>
int main() {
int a = 1;
int b = ~a;
printf("a:%d b:%d\n", a, b);
return 0;
}
我们令a = 1,对其取反,得到结果如下👇
可以看到,对1取反结果是-2,为什么会这样?我们通过二进制和补码两个锚点做以下分析。
1为int类型,即32位,所以1的补码为:
(0000 0000 0000 0000 0000 0000 0000 0001)补
对其按位取反,得到以下补码:
(1111 1111 1111 1111 1111 1111 1111 1110)补
将这个补码化成原码,第一位为字符位,其余按位取反末位加1:
(1000 0000 0000 0000 0000 0000 0000 0010)原 = -2
这便是-2的来历。
b.按位与 &
以下为测试代码👇
#include <stdio.h>
int main() {
int a = 1;
int b = 0;
printf("a & b = %d\n", a & b);
printf("~a & b = %d\n", ~a & b);
printf("a & ~b = %d\n", a & ~b);
printf(