大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
十进制转二进制补码(正负都可) 指针初学
将一个十进制正(负)整数转换为对应的二进制补码(用指针完成
十进制转二进制:1.先判断该整数是正数还是负数 如果是正数则二进制补码首位为1 , 且对应的二进制补码就是原. 如果是 负数 则二进制补码为原码基础上取反且末位加1(加1则涉及进位 )
代码:
#include"stdio.h"
#include"Stdio.h"
int main()
{
int *p;
int x,i;
printf("输入一个十进制整数:");
scanf_s("%d", &x);
p = (int *)malloc(sizeof(int) * 32);//为二进制分配内存空间
if (x < 0)//负数转正 如果为负数 二进制第一位为1 正数则为0
{
*p = 1;
x = -x;
}
else if (x > 0) *p = 0;
//判断正负 改首位
//-----------------------------------------------------------------------
for(i=31;i>=1;i--)//原码
{
*(p+i) = x % 2;
x = x / 2;
}
//-----------------------------------------------------------------------
//二进制取补码规则;若x为负数则 源码换反码 且反码末位加1
if (*p == 1)//换反码
{
for (i = 1; i <=31; i++)
{
if (*(p+i) == 1) *(p + i) = 0;
else *(p + i) = 1;
}
}
if (*p == 1)//负数
{
if (*(p+31) == 0) *(p + 31) = 1;//最后一位为0 则直接加1
else if (*(p + 31) == 1) //最后一位为1 进位
{
for (i = 1; i <= 31; i++)
{
if (*(p + 31) + 1 == 2 )//逢2进1
{
*(p + 31) = 0;
*(p +30) += 1;
}
else if (i > 0 && *(p + i) == 2)
{
*(p + i) = 0;
*(p + i+1) += 1;
}
}
}
}
//-----------------------------------------------------------------------
for (i = 0; i <= 31; i++)//输出
{
printf("%d", *(p + i));
}
printf("\n");
system("pause");
return 0;
}
运行测试:
测试: 5 结果:000000000000000000000000000101
测试: -5 结果:11111111111111111111111111111011
测试: -7 结果:11111111111111111111111111111011
初学阶段,算法可能有问题,不妥的多提意见…
参考资料:
1.十进制转换为二进制、原码、反码、补码、移码.
2.二进制补码 百度百科.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180121.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...