位操作符(只适用整数,针对2进制)
& 且(1 1 为 1 .其余为0)
| 或 (0 0 为 0.其余为1 )
^ 亦或 (相同为0,相异为1)
((满足交换律))
对补码进行& | ^
整数储存形式 补码形式
int型整数占4个字节,一个字节是8位,总共32位
-
确定符号位:
- 对于 32 位整数,最高位(最左边那一位)被用作符号位。
- 符号位为 0 表示正数,符号位为 1 表示负数。
-
原码表示:
- 先将整数按照绝对值大小转换成二进制形式,这就是原码。
- 例如,整数
+5
的原码为00000000 00000000 00000000 00000101
(这里为了方便展示,将 32 位分成了 4 个字节,每个字节 8 位来写);整数-5
的原码为10000000 00000000 00000000 00000101
。
-
反码表示(针对负数):
- 如果是负数,在原码的基础上,除符号位外,其余各位按位取反,得到反码。
- 例如,
-5
的反码为11111111 11111111 11111111 11111010
。
-
补码表示(针对负数):
- 负数的反码加 1 就得到补码,这就是该负数在内存中的存储形式。
- 例如,
-5
的补码为11111111 11111111 11111111 11111011
,计算机内存中存储-5
时实际存的就是这个补码形式。 - 而正数的补码和原码相同,所以
+5
在内存中存储的就是其原码00000000 00000000 00000000 00000101
& 就是对补码进行挨位比较(1 1 为 1 .其余为0)
| 就是对补码进行挨位比较(0 0 为 0.其余为1 )
^ 就是对补码进行挨位比较(相同为0,相异为1)
小性质
a ^ a = 0
0 ^ a = a
a ^ b ^ a = b(满足交换律)
证明 a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
下面是代码
cs
#include<stdio.h>
int main()
{
//位操作符
int a = 3;
int b = 9;
//a的原码
//00000000000000000000000000000011
//a的反码(a是正数,原反补相同)
//00000000000000000000000000000011
//a的补码
//00000000000000000000000000000011
//b的原码
//00000000000000000000000000001001
//b的反码(a是正数,原反补相同)
//00000000000000000000000000001001
//b的补码
//00000000000000000000000000001001
//对补码进行& | ^
//&
int c = a & b;
printf("c = %d \n", c);
//& 1 1 为 1 其余为0
//a的补码
//00000000000000000000000000000011
//00000000000000000000000000001001
//b的补码
//00000000000000000000000000000001
//结果1
// |
int d = a | b;
printf("d = %d \n", d);
//| 0 0 为 0 其余为1
//a的补码
//00000000000000000000000000000011
//00000000000000000000000000001001
//b的补码
//00000000000000000000000000001011
//结果11
// ^
int e = a ^ b;
printf("e = %d", e);
//^ 相同为0 相异为1
//a的补码
//00000000000000000000000000000011
//00000000000000000000000000001001
//b的补码
//00000000000000000000000000001010
//结果10
return 0;
}
负数类似
负数最高位为1(最高位即符号为)
只是负数反码是对原码取异(1 0)(最高位仍为1)
负数补码是反码加1
按位取反操作符 ~
作用于一个整数操作数,将该整数的每一位二进制数字进行翻转,即0变为1,1变为0