数制互相转换的源程序1

来源:互联网 发布:网络诈骗宣传片 编辑:程序博客网 时间:2024/05/22 23:59
从十进制数到二进制数的转换

作  者:winfox
发表于:2004-3-24

   从十进制数到二进制数的转换

// by Lynxcn version 1.0
// 转载请保留文章的完整性
// 本文只研究将无符号整数转换成二进制数

一、算法
1.除法
用十进制整数不断除以2,并记下余数,直到商为0,最后把余数反向读出即可。
如:将十进制数10转换成对应的二进制数
商 余数
10/2 5 0
5/2 2 1
2/2 1 0
1/2 0 1
反向读出即为:1010

2.位运算
由于数据在计算机中是以二进制形式存储的,所以我们只需将其各位输出(问题就在这里)即可。
按位与运算(&):参加运算的两个数据,按二进制位进行"与"运算。如果两个对应的二进制位都
为1,则结果为1,否则为0。
如:0&0=0, 0&1=0, 1&0=0, 1&1=1
十进制数3,13按位与如下:
0 0 0 0 0 0 1 1 (3)
& 0 0 0 0 1 1 0 1 (13)
------------------------------
0 0 0 0 0 0 0 1 (1)
掩码:掩码是将某些位设为开(1),而某些位设置为关(0)的位的组合。假设定义符号常量Mask为
1000,我们进行位与(&)运算: index=index&Mask; 此语句将index对应Mask为1的位设置为1,
其它位置0.因为:0&1=0,1&1=1,即为其本身;而无论0还是1与0按位与结果都为0,即被屏敝。

二、程序清单

**********************************************************
清单1:循环
**********************************************************
// cody by Lynxcn
// 十进制--->二进制
#include
#define M (sizeof(int)>2 ? 32 : 16)
int main(void)
{
int p, index=0, bin[M]={0};
int num;
cout<<"enter a num: ";
cin>>num;
if(num<0)
cout<<"Data Error"<else if(num==0)
cout<<0<else
{
do{ //算法
bin[index]=num%2;
num=num/2;
index++;
}while(num);
//滤掉前导无效0
index=M-1;
while(!bin[index])
{
index--;
}
p=index;
//输出
for(index=p;index>=0;index--)
cout<cout<}
return 0;
}

**********************************************************
清单2: 递归函数(但效率不是很高)
**********************************************************
// cody by Lynxcn
// 十进制--->二进制
#include
void dec_bin(int);
int main(void)
{
int num;
cout<<"enter a num: ";
cin>>num;
if(num<0)
cout<<"data error"<else
dec_bin(num);
cout<return 0;
}
void dec_bin(int n)
{
int mod;
mod=n%2;
if(n>=2)
dec_bin(n/2); //因为先求出的余数要最后输出,所以用递归
cout<return;
}

**********************************************************
清单3: 位运算
**********************************************************
// cody by Lynxcn
// 十进制--->二进制
#include
int main(void)
{
unsigned num, Mask;
Mask=sizeof(int)>2 ? 0x80000000 : 0x8000;
cout<<"Enter a number: ";
cin>>num;
if(num==0)
cout<<0<else
{
while(Mask)
{
if(num&Mask) //过滤前导无效0
{
while(Mask) //算法
{
cout<<(num&Mask ? 1 : 0);
Mask>>=1;
}
cout<break;
}
Mask>>=1;
}
}

return 0;
}

win2k server + vc6下调试通过;

三、其它
即然二进制会转换了,八进制、十六进制自然也不在话下。:)

End. 03-24-2004

 
原创粉丝点击