数値の基数 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
これが 2 番目の重要な事実です。
それでは、学んだことをまとめてみましょう。
の 2 進数表現n
は、 の 2 進数表現n / 2
の最後の桁がn
追加された の 2 進数表現です。これは重要な事実その 2 からです。
のバイナリ表現の最後の桁は、 をn
計算することで計算できますn % 2
。これは重要な事実 1 からです。
when n = 0
. その場合、 のバイナリ表現はn
です0
。で割るというルールを使用しようとすると、2
2 で割ることをやめることはありません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
}