思路:方法不止一种,我给你写的常规思路:
一、通过与2的次方除法,可得十进制对应二进制的位数,再同高位到低位计算,将十进制数转成对应的二进制数(字符串形式)。
二、将二进制数字符串,进行倒序,就得到你要的逆序二进制数。
三、十进制转二进制,以及字符串倒序分别单独写成函数。适用其它整数。
注意:我代码中的二进制是不包含符号位。如你希望二进制最高位还要有符号,请自行修改(可判断正负后,在我的进制转换函数后面给字符串最高位插入一个符号位(可realloc函数修改动态申请的字符串数组长度))。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
char *fun_10To2(int num);//10进制数字转二进制数字(字符串表示)失败返回NULL
char *invertStr(char *str);//颠倒字符串成功返回颠倒后的字符串,失败返回NULL
int main()
{
int num=12;
char *str=NULL;
for(num=10;num<=20;num++,free(str),str=NULL)
{
str=fun_10To2(num);
if(!str)return 1;
printf("十机制数:%d,转二进制后为:%s\n",num,str);
str=invertStr(str);
printf("逆序后的二进制后为:%s\n\n",str);
}
return 0;
}
char *invertStr(char *str)
{
char *p0=str,*p1=str,c;
if(!str)return NULL;
while(*(p1+1)!=0) p1++;//将p1指向数组最后一个字符地址
while(p0<p1)//p0,p1分别指向字符串两头,往中间移动同时交换值
{
c=*p0;
*p0=*p1;
*p1=c;
p0++;
p1--;
}
return str;
}
char *fun_10To2(int num)
{
double m=0;
int b,sum=0;
char *str=NULL,*p=NULL;
while(1)//计算num对应二进制最多m+1位
{
b=(int)pow(2,m);
sum+=b;
if(sum>=num)
break;
m++;
}
str=(char *)malloc(sizeof(char)*(m+2));//多留一位给结束符号0
if(!str){printf("异常!内存申请失败!\n");return NULL;}
memset(str,0,sizeof(char)*(m+2));//字符数组填充0
p=str;
while(m>=0)//转二进制字符串数字
{
*p=num/(int)pow(2,m)+'0';
num=num%(int)pow(2,m);
m--;
p++;
}
return str;
}