为了找到一个数字的 base-2 表示,我们寻找b0...bn
这样的位
n = bn * 2^n + b_(n - 1) * 2^(n - 1) + ... + b1 * 2^1 + b0 * 2^0
现在我们专注于寻找b0, b1, ..., bn
. 注意
(bn * 2^n + b_(n - 1) * 2^(n - 1) + ... + b1 * 2^1 + b0 * 2^0) % 2 = b0
因为b0 * 2^0 % 2 = b0
和bj * 2^j % 2 = 0
何时j >= 1
因为2^j % 2 = 0
如果j >= 1
。所以,
n = bn * 2^n + b_(n - 1) * 2^(n - 1) + ... + b1 * 2^1 + b0 * 2^0
=> n % 2 = (bn * 2^n + b_(n - 1) * 2^(n - 1) + ... + b1 * 2^1 + b0 * 2^0) % 2 = b0
我们发现了b0 = n % 2
。这个关键事实第一。
现在,让我们除以 2:
n / 2 = (bn * 2^n + b_(n - 1) * 2^(n - 1) + ... + b1 * 2^1 + b0 * 2^0)
= bn * 2^(n - 1) + b_(n - 1) * 2^(n - 2) + ... + b1 * 2^1
现在,让我们在这里停下来。让我们仔细看看n / 2
. 请注意,它完全等于n
仅去掉最后一位的二进制表示。那是
n = bn b_(n-1) ... b1 b0
n / 2 = b_n b_(n-1) ... b1
这是第二个关键事实。
所以,让我们把我们学到的东西放在一起。
的二进制表示n
是附加n / 2
了二进制表示的最后一位的二进制表示。这是来自第二个关键事实。n
的二进制表示的最后一位数字n
可以通过计算来计算n % 2
。这是第一条关键事实。
除了一种情况:当n = 0
. 在这种情况下, 的二进制表示n
是0
。如果我们尝试使用除以 的规则2
,我们将永远不会停止除以 2。因此,我们需要一个规则来捕获 when n = 0
。
因此,要计算 的二进制表示n
,首先计算 的二进制表示n / 2
,然后附加 的结果,n % 2
但一定要处理 时的情况n = 0
。让我们把它写成代码:
// print binary representation of n
void ToBin(int n) {
if(n > 1) { // this is to handle zero!
ToBin(n / 2); // this will print the binary representation of n
}
print(n % 2); // this will print the the last digit
}