求负整数补码不用对原码+1进位的技巧

本文详细介绍了一种快速计算负整数补码的方法,适用于signedchar类型,涵盖了正整数和负整数的原码、反码及补码转换过程。通过三个步骤实现:求负数绝对值的原码,定位第一个1并取反其前的位,最终得到补码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考自[关于求负数补码](https://www.cnblogs.com/chiweiming/p/8932140.html)
正整数的补码、反码均同其原码。负整数的补码是其反码(保留符号位,其他位取反)再+1,这将涉及进位操作。一个求负整数补码的技巧是:
1、求负数绝对值的原码;
2、从原码的最后一位往前数,当遇到第一个1时停在此位置;
3、将第一个1位前面的位全部取反。
对signed char而言,表达范围为[-2^7 ,  2^7-1]

 原码反码补码规律
1270111 1111** 
10000 0001** 
00000 00000111 11110000 0000 
-11000 00011111 11101111 11111原码最右的1位左边所有位取反
-1271111 11111000 00001000 0001127原码最右的1位左边所有位取反
-1281000 00001111 11111000 0000128原码本身
//递推求整数(正整数、负整数)二进制原码
	int GetBinaryDiTui(int n, vector<int>& arr) {
		if (n<-1 * (pow(2, 7) - 1) || n>pow(2, 7)) return 0; //限求unsigned char
		arr = vector<int>(8, 0); 
		if (n < 0) {
			arr[0] = 1;
			n = -1 * n;
		}
		int nCount = 0;
		int a = 0;
		while (n) {
			a = n % 2;
			nCount++;
			arr[arr.size() - nCount] = a;
			n = n / 2;
		}
		return 1;
	}
	//求整数(正整数、负整数)二进制补码
	void GetBinaryBuCode(int n, vector<int>& arr) {
		if (n >= 0) {
			GetBinaryDiTui(n, arr);
			return;
		}
		else {
			GetBinaryDiTui(-1*n, arr); //求负数绝对值的原码
			int nindex = arr.size() - 1;
			while (arr[nindex] == 0) nindex--;
			int n = 0;
			while (n < nindex) {
				arr[n] = arr[n] == 0 ? 1 : 0;
				n++;
			}
			return;
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值