写作初衷
以此篇来记录我的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;
}