十进制转二进制的三种方法
•
算法结构
十进制转二进制要注意考虑负数:
计算机中负数的存储一般用补码储存
负数的补码=对应正数的原码按位取反再加一
目录
方法一:直接转换法
方法二:利用无符号数机制
方法三:位运算
方法一:直接转换法:
#include
#include
#define OK 1
int dectobin(int n,char*p,int l){
//l表示要转化的长度 返回值int表示是否转h化正确
int k=0;
int i=l-1;
if(n0){
p[i]=n%2+48;
n=n/2;
i--;
}
while(i>=0){
p[i]=48;
i--;
}
if(k==-1){
int i=0;
while(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#include #define OK 1int dectobin(unsigned n,char*p,int l){ int k=0; int i=l-1;// if(n0){ p[i]=n%2+48; n=n/2; i--; } while(i>=0){ p[i]=48; i--; }// if(k==-1){// int i=0;// // while(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
#include
#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;
}
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/ecac7e0cee.html
