目录
- 按位与、或、异或操作符的操作数必须是整数
- 按位是按二进制位操作的,也就是按数据存在内存中的补码进行与、或、异或操作
- 关于整数补码的相关知识请见:整数的二进制表示形式:原码、反码、补码-CSDN博客
& --- 按位与操作符
按位与操作符运用规则
对应二进制位有0则为0,两个同时为1,才是1
按位与操作符相关代码
int a = 3;
int b = -5;
int c = a & b;
printf("%d\n", c);
3存储在变量a的补码 和 (-5)存储在变量b的补码如下图:
由以上a和b的补码得出a & b:
- (a & b)的最高位为0,说明为正整数,且正整数的原码、反码、补码相同
- (a & b)的二进制转换十进制:1*2^0 + 1*2^1 = 3
- 所以(a & b)的值存储在变量c中,以%d的形式打印出来为3
按位与操作符相关代码验证
| --- 按位或操作符
按位或操作符运用规则
对应的二进制位有1则1,两个同时为0,才为0
按位或操作符相关代码
int a = 3;
int b = -5;
int c = a | b;
printf("%d\n", c);
结合以上的绘图,先计算出(a | b)的补码
(a | b)的补码为负整数,负整数的补码到原码是需要计算的
(a | b)的原码存储到变量c中,c所存储的值为:-5
按位或操作符相关代码验证
^ --- 按位异或操作符
按位异或操作符运用规则
对应的二进制位相同为0,相异为1
按位异或操作符相关代码
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d\n", c);
计算(a ^ b)的补码
(a ^ b)的补码为负整数,计算出原码
由此可得(a ^ b)的原码存储的变量c中的值为:-8