负二进制的面试题

今天看到一篇关于面试ATC的心得,呵呵,里面提到了一个负二进制的题目:D M$也真够能折腾的。

1.  如何用负二进制表述十进制等式5+3=8? (原题)
解: DCBA(-2)=D*(-2)^3+C*(-2)^2+B*(-2)^1+A*(-2)^0 (dec)
            =-D*2^3+C*2^2-B*2^1+D (dec)

则: 101  (neg-bin) == 5(dec)
    111  (neg-bin) == 3(dec)
    11000(neg-bin) == 8(dec)

2.  如果以竖式形式描述负二进制加法计算? (我无聊自己给自己出的:D)
解: 首先得归纳一下负二进制加法规则,
    凡n位上的数字,n为奇数的,如个位、百位、万位等,相加结果得正数,可以与低位相加的进位相抵
    凡n位上的数字,n为偶数的,如十位、千位等,相加得负数,可以与低位相加的进位相抵 

    54321 

    00101 (A) 
  + 00111 (B) 
  ------------ 
    11000     
    
    0+1=1  (neg-bin)
    1+1=110(neg-bin)
    0+0=0  (neg-bin)

    其中,第一位相加的进位与数B上的第二位上的1相抵,所以和的第一、二位为0,
    第三位两个1相加为110,至此加法结束。

3.  更加复杂一点的法则实例:竖式快速算法
解: 首先我们两位两位的分析竖式加合,其中有些模式应用起来很方便

    11 == 00
    01
   
    01 == 00
    11
   
    11 == 10
    11
   
    10 == 11
    01
   
    01 == 11
    10
   
    01 == 110
    01
   
    10 == 1100
    10
   
    10 == 1101
    11
   
    11 == 1101
    10
   
    可见,有些两位的局部运算可以在竖式中直接消除,而有些则需要扩展至3位到4位,来看个例子
   
    0110101010
  + 0010100101
    ----------
    01xxxx1111 (利用快速消除法则所得的快速结果)
    1100       (扩展到4位)
  +   1100     (扩展到4位)
    -----------
    0011001111 (直接得出答案)
   
    胡乱敲一个竖式计算起来耍耍,
   
      1010001010101001
      1101010100100111
      ----------------
      xx11011110xx1100
    1101
              1100
    ------------------
    1101110111xx001100
            1101
    ------------------
    110111011001001100
   
    -41639 + -11037 = -52676 呵呵,验算完毕

原文地址:https://www.cnblogs.com/neoragex2002/p/88372.html