我理解的就是将十进制整数转换成二进制数,然后进行运算。
- &:按位与运算,
有0为0,全1为1
一个整数 5 和 -6
二进制为:00000000000000000000000000000101
10000000000000000000000000000110
因为计算机是通过补码进行运算的,所以需要求出5和-6二进制的补码.
正整数的原码、反码、补码相等
所以5的二进制补码为
000000000000000000000101
负数的原码:第一位为1,代表负号,其余的转换成二进制就行了
10000000000000000000000000000110
11111111111111111111111111111111001 //-6的反码
111111111111111111111111111111111010 //-6的补码
通过补码运算,有0为0,全1为1。
00000000000000000000000000000101
111111111111111111111111111111111010
最终得出:00000000000000000000000000000000
#include <stdio.h>
//计算机运算是按补码进行运算的,
int main()
{
int a = 5;
int b = -6;
int c = a & b;//按位与 对应的二进制为,有0为0,两个都为1才是1
//00000000000000000000000000000101 5的二进制 正整数的原码、反码、补码相同
//10000000000000000000000000000110 -6的二进制
//11111111111111111111111111111001 -6的反码
//11111111111111111111111111111010 -6的补码
//用补码,按位与计算
//00000000000000000000000000000101
//11111111111111111111111111111010
//00000000000000000000000000000000
printf("%d\n", c);
return 0;
}
- | :按位或运算 ,
有1为1,全0为0
以21和26举例,
21和26的补码为:
0000 0001 0101
0000 0001 1010
0000 0001 1111
- ^:异或运算
相同为0,不同为1
以21和26举例,
21和26的补码为:
0000 0001 0101
0000 0001 1010
0000 0000 1111
- ~:非运算
按位取反,0变1,1变0
8: 0000 1000
~8: 1111 0111