public class Binary {
public static void main(String[] args) {
// 显示N的二进制表示法
int n = Integer.parseInt(args[0]);
// set v to the largest power of two that is <= n
int v = 1;
while (v <= n/2) {
v = v * 2;
}
// 现在v是<=N的2的最大幂
while (v > 0) {
// 以递减顺序抛出2的幂
if (n < v) {
System.out.print(0);
}
// v is present in n, so remove v from n
else {
System.out.print(1);
n = n - v;
}
// next smallest power of 2
v = v / 2;
}
System.out.println();
}
}
此程序将来自命令行的十进制转换为二进制(基为2)表示。根据为一个数可以分解为2的幂的和。例如:19的二进制表示法是10011,这种表示就是19=16+2+1.为了计算N的二进制表示法,我们以递减顺序考虑小于或等于N的2的幂,来确定哪些属于二进制分解(因为对应与二进制表示法中的1位)。此过程像使用天平来称对象的重量相对应,使用2的幂值为砝码。首先,我们发现最大的幂值比物品轻。然后,以递减顺序考虑幂值,逐一增加砝码来测试,是否是对象轻了。
如果对象轻了,我们去除刚加上的砝码;如果还是砝码轻,我们留下砝码并继续加下一个砝码。每个砝码对应于对象重量在二进制表示法中的位:留下砝码对应在对象重量的二进制表示法中的1,而去除的砝码对应于对象重量二进制表示法中的0.
在Binary中,变量v对应于当前被测试的砝码,变量n说明对象重量的剩余部分(未知部分)(模拟留在天平上留下的重量,我们从n中减去砝码)。
v的值以2的幂减少。当v的值大于n,Binary显示0;否则显示1并减去从n中减去v.
Java程序Binary对19的2的幂的循环跟踪 | ||||||
n | 二进制表示法 | v | v > 0 | 二进制表示法 | n < v | 输出 |
19 | 10011 | 16 | true | 10000 | false | 1 |
3 | 0011 | 8 | true | 1000 | true | 0 |
3 | 011 | 4 | true | 100 | true | 0 |
3 | 01 | 2 | true | 10 | false | 1 |
1 | 1 | 1 | true | 1 | false | 1 |
0 | 0 | false |
|
参考书籍:Java程序设计一种跨学科的方法