10進数から2進数に変換するプログラムを書きたいです。
10 進数から 2 進数に変換する方法がわかりません。
ルールを見つける方法とそれがどのように機能するかについてはわかりません。
例:7(base10)-->11011(base-2)
私はそれが7 = (-2)^0*1 + (-2)^1*1 + (-2)^2*0 + (-2)^3*1 + (-2)^4*1
.
10進数から2進数に変換するプログラムを書きたいです。
10 進数から 2 進数に変換する方法がわかりません。
ルールを見つける方法とそれがどのように機能するかについてはわかりません。
例:7(base10)-->11011(base-2)
私はそれが7 = (-2)^0*1 + (-2)^1*1 + (-2)^2*0 + (-2)^3*1 + (-2)^4*1
.
アルゴリズムについては、http://en.wikipedia.org/wiki/Negative_base#Calculationで説明されています。基本的に、残りを正の基本ケースとして選択し、残りが非負で最小であることを確認します。
7 = -3*-2 + 1 (least significant digit)
-3 = 2*-2 + 1
2 = -1*-2 + 0
-1 = 1*-2 + 1
1 = 0*-2 + 1 (most significant digit)
ちょうど私の 2 セント (C#):
public static int[] negaBynary(int value)
{
List<int> result = new List<int> ();
while (value != 0)
{
int remainder = value % -2;
value = value / -2;
if (remainder < 0)
{
remainder += 2;
value += 1;
}
Console.WriteLine (remainder);
result.Add(remainder);
}
return result.ToArray();
}
はるかに効率的な方法 (Librik/Szudzik/Schröppel によるもの) があります。
uint64_t negabinary(int64_t num) {
const uint64_t mask = 0xAAAAAAAAAAAAAAAA;
return (mask + num) ^ mask;
}
変換方法とその逆については、この回答で詳しく説明しています。