负二进制的面试题
今天看到一篇关于面试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 呵呵,验算完毕