十进制转二进制的三种方法

十进制转二进制要注意考虑负数:

计算机中负数的存储一般用补码储存
负数的补码=对应正数的原码按位取反再加一

目录

方法一:直接转换法

方法二:利用无符号数机制

方法三:位运算


 方法一:直接转换法:

#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