十进制转二进制要注意考虑负数:
计算机中负数的存储一般用补码储存
负数的补码=对应正数的原码按位取反再加一
目录
方法一:直接转换法:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
int dectobin(int n,char*p,int l){
//l表示要转化的长度 返回值int表示是否转h化正确
int k=0;
int i=l-1;
if(n<0){
n=-1*n;
k=-1;
}
while(n>0){
p[i]=n%2+48;
n=n/2;
i--;
}
while(i>=0){
p[i]=48;
i--;
}
if(k==-1){
int i=0;
while(i<l){
p[i]=p[i]=='1'?'0':'1';
i++;
}
i--;
for(int i=l-1;i>=0;i--){
if(p[i]=='0'){
p[i]='1';
break;
}
else
{
p[i]='0';
}
}
}
return OK;
}
int main(){
char* p=(char*)malloc(sizeof(char)*32);
dectobin(-120,p,32);
//printf("%c",p[0]);
for(int i=0;i<32;i++){
printf("%c",p[i]);
}
}
方法二:利用无符号数机制:
因为每个负数的补码其实都等于一个正数的原码(比如:
对于8位二进制来说
-1的补码就是255的原码
)
可以巧妙地利用这个现象简化算法
#include<stdio.h>
#include<stdlib.h>
#define OK 1
int dectobin(unsigned n,char*p,int l){
int k=0;
int i=l-1;
// if(n<0){
// n=-1*n;
// k=-1;
// }
while(n>0){
p[i]=n%2+48;
n=n/2;
i--;
}
while(i>=0){
p[i]=48;
i--;
}
// if(k==-1){
// int i=0;
//
// while(i<l){
// p[i]=p[i]=='1'?'0':'1';
// i++;
// }
// i--;
// for(int i=l-1;i>=0;i--){
// if(p[i]=='0'){
// p[i]='1';
// break;
// }
// else
// {
// p[i]='0';
// }
// }
// }
return OK;
}
int main(){
char* p=(char*)malloc(sizeof(char)*32);
dectobin(-120,p,32);
//printf("%c",p[0]);
for(int i=0;i<32;i++){
printf("%c",p[i]);
}
}
方法三:位运算
(利用计算机本就是用二进制存储数据的机制,直接用位运算取出)
#include<stdio.h>
#include<stdlib.h>
#define OK 1
int dectobin(int n,int *p,int l){
for(int i=31;i>=0;i--){
p[31-i]=n&(1<<i)?1:0;
}
return OK;
}
int main(){
//printf("%d",9);
fflush(stdout);
int *p=(int*)malloc(sizeof(32));
//p[0]='0';
dectobin(100,p,32);
//printf("%d",p[0])
for(int i=0;i<32;i++){
printf("%d",p[i]);
}
return 0;
}