获取一个整数的二进制数列并且将按奇偶分别打印(X86环境下)

写作初衷

以此篇来记录我的C语言学习,并提升写文章的能力

解题思路

我们知道,整数在电脑中储存方式是二进制的补码形式,由此,通过位操作符和循环遍历就能得到一个整数的二进制补码数列,然后通过遍历数列就能实现该题

具体方法

第一步:得到整数二进制补码

//5的二进制为 00000000 00000000 00000101
//如何得到呢?
//我们知道位操作符&具有读取数据的功能(同为一则为一,否则为零)
//由此我们进行操作5 & 1就得到了该整数二进制数的最后一位
//得到最后一位后怎么得到倒数第二位乃至第一位呢?
//答案是通过 >> 操作符
//由此通过for循环就能得到每一位二进制位
//代码如下:

for (int i = 0; i < 32; i++)
{
    arr[i] = input & 1; //将得到的二进制位都存入数组中
    input = input >> 1;
}

第二步:将得到的二进制码分奇偶存入两个数组中

//该部分代码如下:
for (int i = 0; i < 32; i++)
{
    if (i % 2 == 0)
	{
		even[i / 2] = arr[i];//实现偶数分类
	}
	else
	{
		odd[(i - 1) / 2] = arr[i];//实现奇数分类
	}
}

第三步:打印二进制

在这里为了方便,我们通过一个函数实现打印数组中的元素

//通过前面的分析,我们知道,在存入二进制数据时,二进制数据的顺序被倒序了
//所以该函数应要实现倒序打印数组中的元素
//该部分代码如下:
void print(int arr[16], unsigned int i) //该函数参数为数组和数组长度,不返回
{
    for (int j = i - 1; j >= 0; j--)
	{
		printf("%d", arr[j]);
    }
	printf("\n"); //打印完一行换行,使奇偶分开
}

完整代码

通过前面的分析,我们就能很好的完成该题目了

//由于默认为x86的环境,这里的数据处理就用x86的相关数据了
void print(int arr[16], unsigned int i)
{
	for (int j = i - 1; j >= 0; j--)
	{
		printf("%d", arr[j]);
	}
	printf("\n");
}
int main()
{
	int input = 0;
	int arr[32] ;
	int odd[16] ;
	int even[16] ;

	scanf("%d", &input);
	for (int i = 0; i < 32; i++)
	{
		arr[i] = input & 1;
		input = input >> 1;
	}

	//将二进制码分奇数偶数存进新数组中
	for (int i = 0; i < 32; i++)
	{
		if (i % 2 == 0)
		{
			odd[i / 2] = arr[i];
		}
		else
		{
			even[(i - 1) / 2] = arr[i];
		}
	}

	//分别打印二进制码
	printf("奇数位:\n");
	print(odd, sizeof(odd) / sizeof(odd[0]));
	printf("偶数位:\n");
	print(even, sizeof(even) / sizeof(even[0]));

	return 0;
}

运行结果

补充

除了上面的方法外,还有一种更为高效的方法

int main()
{
	int input = 0;
	scanf("%d", &input);
	for (int i = 31; i >= 0; i -= 2)
	{
		printf("%d ", (1 & (input >> i)));
	}
	printf("\n");
	for (int i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (1 & (input >> i)));
	}
	return 0;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值