一、按位取反:~
在计算机中,数据都是按照二进制进行存储的,即便有了原码、反码、补码。而二进制数在内存中是以补码的形式存储的。
按位取反是将补码的每一位都取反,即0变1,1变0;
#include <stdio.h>
int main()
{
char a = 5;
printf("%d", ~a);
return 0;
}
结果为-6;
正整数:5
正数的原码、反码、补码相同:00000101
按位取反:11111010 //此时取反的结果为原码,还需要将其转化为补码
反码:10000101
补码:10000110
结果:-6
负整数:-5
原码:10000101
反码:11111010
补码:11111011
按位取反:00000100 //此时取反的结果为原码,因为原码为正数,原反补相同
结果:4
正数按位取反等于其本身+1的负数
负数按位取反等于其本身+1的正数
0按位取反为-1
二、按位与:&
[规则]
0&0=0
0&1=0
1&0=0
1&1=1
#include <stdio.h>
int main()
{
char a = 5,b=9;
char c = a&b;
printf("%d", c);
return 0;
}
结果为1
5的补码:00000101
9的补码:00001001
按位与后结果:00000001 //此时的结果为原码,因为原码为正数,原反补相同
结果:1
三、按位或:|
[规则]
0|0=0
0|1=1
1|0=1
1|1=1
#include <stdio.h>
int main()
{
char a = 5,b=9;
char c = a|b;
printf("%d", c);
return 0;
}
结果为13
5的补码:00000101
9的补码:00001001
按位或后结果:00001101 //此时的结果为原码,因为原码为正数,原反补相同
结果:13
四、按位异或:^
[规则]
0^0=0
0^1=1
1^0=1
1^1=0
#include <stdio.h>
int main()
{
char a = 5,b=9;
char c = a^b;
printf("%d", c);
return 0;
}
结果为12
5的补码:00000101
9的补码:00001001
按位与或后结果:00001100 //此时的结果为原码,因为原码为正数,原反补相同
结果:12