声明:最后一种降幂法颇具魅力,而且与方法二有异曲同工之妙
十进制转二进制的几种方法
输入:一个无符号的十进制整数
输出:对应十进制的二进制显示
例如:input = 10,output = 1010
方法一:除二取余法
Forinput != 0
Cout << input % 2
Input /= 2;
End
输出顺序从低位0到高位(最高的1)依次输出
方法二:位运算
lowone = input & ~(input - 1) //得到最低位的1对应的数值
input = input & (input - 1) //从input中去除最低位的1
方法三:降幂算法
1. Input > 2^n,(n要尽量大)
2. Input > 2^n ,所以n位对应1
Compare( Input, 2^(n - 1)), 如果<,输出0;如果>=,输出1,且从input中减去后者。
n从n开始连续判断到0为止。
例子:
十进制整数100,那么n=6,因为2^6=64<100,2^7=128>100
二进制 十进制 二进制
1100100 100 > 2^6 = 1
100100 36 > 2^5 = 1 (36 = 100-2^6)
00100 4 < 2^4 = 0 (4 = 36-2^5)
0100 4 < 2^3 = 0 (4 维持上一次的结果)
100 4 = 2^2 = 1 (4 维持上一次的结果)
00 0 < 2^1 = 0 (0 = 4-2^2)
0 0 < 2^0 = 0 (0 维持上一次的结果)
上式中红色代表二进制,黑色代表十进制,所以100的二进制等于1100100
原理:从高位向低位的顺序,判断每一位是1还是0.
定理:一个十进制整数肯定大于等于只留下它的最高位1(二进制)对应的十进制数,例如5(101)>4(100),7(111)>4(100)。
所以,只要满足上面的定理,就知道最高位的1处于第几位(从左往右,以0为起始位),即刚才说的“尽量大的n”。然后,减掉这个2^n(最高位1对应的十进制数),进行下一次的判断,对比2^(n-1).因为最高的1已经确定在第n位,那么接下来当然判断n-1位。而且,前面的减去2^n就等价于去掉原先最高位的1.