Как преобразовать десятичное основание (10) в неабинарное основание (-2)? - PullRequest
9 голосов
/ 17 февраля 2012

Я хочу написать программу для преобразования десятичных чисел в негабинарные.

Я не могу понять, как преобразовать десятичную в небабинарную.

Понятия не имею, как найти правило и как оно работает.

Пример: 7(base10)-->11011(base-2)

Я просто знаю, что это 7 = (-2)^0*1 + (-2)^1*1 + (-2)^2*0 + (-2)^3*1 + (-2)^4*1.

Ответы [ 4 ]

11 голосов
/ 17 февраля 2012

Алгоритм описан в 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)
3 голосов
/ 12 января 2016

Только мои два цента (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();
}
1 голос
/ 02 июня 2019
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])
1 голос
/ 07 июня 2016

Существует метод (приписываемый Librik / Szudzik / Schröppel), который гораздо более эффективен:

uint64_t negabinary(int64_t num) {
    const uint64_t mask = 0xAAAAAAAAAAAAAAAA;
    return (mask + num) ^ mask;
}

Метод преобразования и его обратное описание более подробно описано в этот ответ .

...