printf打印二进制数据

改进版的在这里:http://blog.csdn.net/xzongyuan/article/details/29562371


转化的原理,二进制就是把一个number求余数,第一次求余,得出最高位,最后一位因为是2的0次方,不超过2,所以余数一定是0,这可以参考下面的代码实现部分。用递归求余方程,当遇到number为0,表示是二进制的第0位,其它位数,都是直接把num%base的结果printf 出来。注意printf中的num是递归过程中的num,是除以2之后的结果。


详细例子:

十进制整数转二进制
如:255=(11111111)B
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
789=1100010101
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2得0 余1 第1位
原理:
众所周知,二进制的基数为2,我们十进制化二进制时所除的2就是它的基数。谈到它的原理,就不得不说说关于位权的概念。某进制计数制中各位数字符号所表示的数值表示该数字符号值乘以一个与数字符号有关的常数,该常数称为 “位权 ” 。位权的大小是以基数为底,数字符号所处的位置的序号为指数的整数次幂。十进制数的百位、十位、个位、十分位的权分别是10的2次方、10的1次方、10的0次方,10的-1次方。二进制数就是2的n次幂。
按权展开求和正是非十进制化十进制的方法。
下面我们开讲原理,举个十进制整数转换为二进制整数的例子,假设十进制整数A化得的二进制数为edcba 的形式,那么用上面的方法按权展开, 得
A=a(2^0)+b(2^1)+c(2^2)+d(2^3)+e(2^4) (后面的和不正是化十进制的过程吗)
现在假设该数未化为二进制,除以基数2得
A/2=a(2^0)/2+b(2^1)/2+c(2^2)/2+d(2^3)/2+e(2^4)/2
注意:a除不开二,余下了!其他的绝对能除开,因为他们都包含2,而a乘的是1,他本是绝对不包含因数2,只能余下。


下面代码转自http://zhidao.baidu.com/link?url=IFDnUWBD2GZvNEdcXV3xvC6UQwu2cDeBP3cxlFKvF0uIjRv3GNzpzmN1_LblpB_M_VkesPG-h747PanJA3rDLq

#include <stdio.h>

void decToBin(int num,int base);
int main()
{ int decimalNum;
  int base=2;
  printf("Enter number in decimal:");
  scanf("%d",&decimalNum);
printf("\n");
 printf("Decimal%d:",decimalNum);
  decToBin(decimalNum,base);
 printf("(binary)\n");
  return 0;
}
void decToBin(int num,int base)
{if(num>0)
 {decToBin(num/base,base);
   printf("%d",num%base);
 }
}





                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值