C语言_二进制的原码、反码、补码_位运算符:~、|、&、^

二进制 位运算符

& :按位与 相对应的二进制位:都为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,如有侵权请联系删除,谢谢

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值