【发布时间】:2012-03-09 00:17:12
【问题描述】:
我想写一个程序将十进制转换为负数。
我不知道如何从十进制转换为负数。
我不知道如何找到规则以及它是如何工作的。
示例:7(base10)-->11011(base-2)
我只知道是7 = (-2)^0*1 + (-2)^1*1 + (-2)^2*0 + (-2)^3*1 + (-2)^4*1。
【问题讨论】:
标签: algorithm base base-conversion
我想写一个程序将十进制转换为负数。
我不知道如何从十进制转换为负数。
我不知道如何找到规则以及它是如何工作的。
示例:7(base10)-->11011(base-2)
我只知道是7 = (-2)^0*1 + (-2)^1*1 + (-2)^2*0 + (-2)^3*1 + (-2)^4*1。
【问题讨论】:
标签: algorithm base base-conversion
def neg2dec(arr):
n = 0
for i, num in enumerate(arr[::-1]):
n+= ((-2)**i)*num
return n
def dec2neg(num):
if num == 0:
digits = ['0']
else:
digits = []
while num != 0:
num, remainder = divmod(num, -2)
if remainder < 0:
num, remainder = num + 1, remainder + 2
digits.append(str(remainder))
return ''.join(digits[::-1])
【讨论】:
有一种方法(归因于 Librik/Szudzik/Schröppel)效率更高:
uint64_t negabinary(int64_t num) {
const uint64_t mask = 0xAAAAAAAAAAAAAAAA;
return (mask + num) ^ mask;
}
转换方法及其反向在this answer中有更详细的描述。
【讨论】:
算法在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)
【讨论】:
只要我的两分钱(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();
}
【讨论】: