二进制 位运算符
& :按位与 相对应的二进制位:都为1才为1,否则为0
| :按位或 相对应的二进制位:有1为1,否则为0
^ : 按位异或 相对应的二进制位:相同为0,不同为1
~ :按位取反 相对应的二进制位:0变1,1变0
正数:三码合一,原码、反码、补码都相同
负数:原码、反码、补码各不相同
计算如下:
原码:计算出来的二进制
反码:负数:符号位不变,其余位按位取反
补码:负数:符号位不变,反码+1
详见注释
#include<stdio.h>
int main()
{
int a=5,b=4,c1,c2,c3,c4;
// a的原码、反码、补码:0101
// -5原码:1000 0000 0000 0000 0000 0000 0000 0101 // (用32位补全)32位int型,最高位为符号位
// -5反码:1111 1111 1111 1111 1111 1111 1111 1010 // 原码按位取反==反码 (符号位不变)
// -5补码:1111 1111 1111 1111 1111 1111 1111 1011 //反码+1 == 补码
c1=a&b;
// 0101 补码 (真正计算机计算是补码计算)
// | 0100 补码
// --------
// 0100 补码 -->原码:4
printf("c1=%d\n",c1);
c2=a|b;
// 0101 补码 (真正计算机计算是补码计算)
// | 0100 补码
// --------
// 0101 补码 -->原码:5
printf("c2=%d\n",c2);
c3=-a&b;
// -5补码:1111 1111 1111 1111 1111 1111 1111 1011 // 二进制最高位为符号位:0代表正数,1代表负数
// 4原码: 0000 0000 0000 0000 0000 0000 0000 0100 // 正数 原码、反码、补码 相同
// -----------------------------------------
// 0000 0000 0000 0000 0000 0000 0000 0000 // 符号位为0,即正数 so 补码==原码==0
printf("c3=%d\n",c3);
c3=-a|b;
// -5补码:1111 1111 1111 1111 1111 1111 1111 1011 // 二进制最高位为符号位:0代表正数,1代表负数
// 4原码: 0000 0000 0000 0000 0000 0000 0000 0100 // 正数 原码、反码、补码 相同
// -----------------------------------------
// 1111 1111 1111 1111 1111 1111 1111 1111 // 补码
// 补码转原码:(已知补码1111 1111 1111 1111 1111 1111 1111 1111 )
// 1111 1111 1111 1111 1111 1111 1111 1111 (先当作原码)
// 1000 0000 0000 0000 0000 0000 0000 0000 (反码)
// 1000 0000 0000 0000 0000 0000 0000 0001 (反码+1==补码) 即为原码 == -1
// note:(因为一开始把补码当成原码,所以再换回去,即为原码)
printf("c3=%d\n",c3);
a=~a;
// a的补码: 0000 0000 0000 0000 0000 0000 0000 0101 (正数的原码、反码、补码相同)
// ~(按位取反) 1111 1111 1111 1111 1111 1111 1111 1010 (计算机计算用的是补码)
// 把补码转为原码
// 1111 1111 1111 1111 1111 1111 1111 1010 (把补码先当成原码)
// 1000 0000 0000 0000 0000 0000 0000 0101 (反码)
// 1000 0000 0000 0000 0000 0000 0000 0110 (反码+1==补码)(即为原码,因为一开始先反着取的)
// 即 -6
printf("a=%d\n",a);
return 0;
}
仅作学习笔记,取材于B站视频:https://www.bilibili.com/video/BV1AN411X7So?from=search&seid=17551571406550894740,如有侵权请联系删除,谢谢