【C/C++】获取整数的二进制形式字符串

本文介绍如何将整数转换成其二进制形式的字符串,讲解了正负数在计算机中存储的补码原理,以及为什么使用补码。并提供了一个计算过程作为示例。

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

思路


使用循环使整数左移i位,并取最高位,如果当前最高位为1则值为'1',否则为'0'。这样拼接出一个字符串。


注意:计算机中存储的是数字的补码。


关于正、负数的原码、反码、补码。

正数:原码、反码、补码都一样。 
负数:反码(除了最高位,其它位取反)补码(反码+1) 


为什么要存储补码,而不是原码?

为了统一运算方法。使用补码对有符号整数进行加、减不需要关心符号位。 
例如:1 + (-2) = -1 
-2的原码 
1000 0000 0000 0000 0000 0000 0000 0010 
-2的反码 
1111 1111 1111 1111 1111 1111 1111 1101 
-2的补码 
1111 1111 1111 1111 1111 1111 1111 1110 

计算过程: 
    0000 0000 0000 0000 0000 0000 0000 0001 
+ 1111 1111 1111 1111 1111 1111 1111 1110 
= 1111 1111 1111 1111 1111 1111 1111 1111 
-1的补码:1111 1111 1111 1111 1111 1111 1111 1111 


使用补码把有符号整数的计算简化成一步,大大提高了效率。 
如果使用原码:1.判断数字的符号位。2.取被加/减数的绝对值 3.加上/减去绝对值 

代码


#include 
#include 

const int INT_SIZE = sizeof(int)*8; // int类型整数的位数
const int MAX_HEIGHT_FLAG = 1 << (INT_SIZE - 1); // 用于取最高位

// 取一个整数的二进制形式字符串,参数一为该整数,参数二为字符串数组首地址
void Int2Binary(int num, char* str){
	
	// 如果是负数,需要先求出原码
	if (num<0)
	{
		// 计算机中存储的是数字的补码(取反+1)
		num = ~(num - 1 ); //求原码(-1,取反)
		num |= MAX_HEIGHT_FLAG; //负数最高位为1
	}

	// 每次循环使数字左移i位,并取最高位
	char val = 0;
	for (int i=1; i<=INT_SIZE; ++i)
	{
		val = MAX_HEIGHT_FLAG&num << (i-1) ? '1' : '0'; //左移并取最高位,如果当前最高位为1则val值为'1',否则为'0'
		str[i-1] = val;

		printf("%c", val);		
		if (i%4==0)
		{
			printf(" ");
		}
	}	
	str[INT_SIZE] = 0; //结束符
	printf("\n");
}

// 输入任意位数int整数,打印内存的二进制存储。
void main(){

	int num = 0;

	while (1){
		scanf_s("%d", &num);

		char str[INT_SIZE + 1];

		Int2Binary(num, str);

		printf("num=%d binary=%s \n", num, str);

	}

	system("pause");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值