根据评论要求,改进代码:
1、函数getBCode是题目要的递归函数,实现转二进制(最高位是符号位)。
思路是十进制数绝对值除以2求余,得到反向二进制原码,反向创建链表保存结果,最终得到的单向链表就是完整二进制数原码,之后根据正负性,负数取反+1。链表头添加符号位。
2、函数freeBny为释放链表,如要重复调用函数getBCode,每次调用需调用一次freeBny。
3、函数showBny是打印输出,为对齐显示,按4的倍数位打印,高位补齐的位数值均与符号位一致。
#include
#include
#include
typedef struct binary//成员用char类型保存数值,不是'1'或'0'的ASCII码
{
char b;//一位二进制数0或1
struct binary *next;
}BNY;
BNY *getBCode(int n);//获得二进制数(最高位是符号位)
void showBny(BNY *bnyHead);//对齐打印二进制数(保证是4的倍数)
void freeBny(BNY *bnyHead);//释放二进制数链表空间
int main()
{
int n;
BNY bny,*bnyHead=&bny;
while(1)
{
printf("请输入一个整数:"),scanf("%d",&n);
bnyHead->next=getBCode(n);
printf("转为二进制数:"),showBny(bnyHead);
freeBny(bnyHead);
printf("\n");
}
return 0;
}
void freeBny(BNY *bnyHead)
{
BNY *prev=NULL,*bny=NULL;
bny=bnyHead->next;
while(bny)
{
if(prev) prev->next=NULL,free(prev),prev=NULL;
prev=bny;
bny=bny->next;
}
bnyHead->next=NULL;
}
void showBny(BNY *bnyHead)
{
int i,f=-1,len=0,n=0;
BNY *bnySave=bnyHead;
while(bnyHead->next)
{
if(f==-1) f=bnyHead->next->b;
len++;
bnyHead=bnyHead->next;
}
if(len%4)
n=4-len%4;
for(i=0;i bnyHead=bnySave; while(bnyHead->next) { printf("%d",bnyHead->next->b); n++; if(n==4)printf(" "),n=0; bnyHead=bnyHead->next; } } BNY *getBCode(int n) { int s,y; static BNY*bnyPrev=NULL; static int cy=0,f=-1;//加1进位用 if(f==-1 && n>=0)f=1; if(f==-1 && n<0)f=0,cy=1; n=abs(n); BNY *bnyNew=NULL; s=n/2,y=n%2; bnyNew=(BNY *)malloc(sizeof(BNY)); if(!bnyNew) return NULL; bnyNew->b=y; // 如是负数,直接取反+1 if(!f) bnyNew->b=!(bnyNew->b);//从最低位开始,负数取反 if(cy)bnyNew->b=bnyNew->b+cy,cy=0;//负数+1 if(bnyNew->b>1)bnyNew->b=0,cy=1; bnyNew->next=NULL; if(bnyPrev) bnyNew->next=bnyPrev; bnyPrev=bnyNew; n=s; if(n==0) { bnyNew=(BNY *)malloc(sizeof(BNY));//添加符号位 if(!bnyNew) return NULL; if(!f) bnyNew->b=1; else bnyNew->b=0; bnyNew->next=bnyPrev; bnyPrev=NULL; cy=0,f=-1; return bnyNew; } return getBCode(n); }
//试试看下面代码
void func(unsigned int x, int cnt){
if(cnt > 31)
return;
if(cnt!=0 && cnt%4 == 0){
printf(" ");
}
printf("%u", (x >> (31 - cnt)) & 0x01) ;
func(x, ++cnt);
}
int main() {
int x =-9;
func(x, 0);
return 0;
}