【问题标题】:How to convert a decimal base (10) to a negabinary base (-2)?如何将十进制基数(10)转换为负数基数(-2)?
【发布时间】: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


【解决方案1】:
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])

【讨论】:

    【解决方案2】:

    有一种方法(归因于 Librik/Szudzik/Schröppel)效率更高:

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

    转换方法及其反向在this answer中有更详细的描述。

    【讨论】:

      【解决方案3】:

      算法在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)
      

      【讨论】:

        【解决方案4】:

        只要我的两分钱(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();
        }
        

        【讨论】:

          猜你喜欢
          • 2021-12-30
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          • 2017-12-28
          • 1970-01-01
          • 2017-08-14
          • 1970-01-01
          • 2011-02-23
          相关资源
          最近更新 更多