【题目】
【分析】 正数的原、反、补是一样的。 负数的源码等于反码+1. 比如-7: 源码:1000 0111 反码:1111 1000(符号位不取反) +1 :1111 1001 所以-7的补码为:1111 1001
我们来看一下两个数相加的运算过程:
-7+12 = 5 12的二进制位:0000 1100 1111 1001 + 0000 1100 ---------------- 1 0000 0101 多的1丢掉,结果为:0000 0101,即5。
分来来看就是:两个二进制相加的结果为:本位相加+上一位的进位。即: 1 1 1 1 1 0 0 1 + 0 0 0 0 1 1 0 0 等于: 1 1 1 1 0 1 0 1 //本位相加的结果 + 0 0 0 0 1 0 0 0 向左移一位 //前一项的进位
本位相加的结果为:1?1 = 0 1?0 = 1 0?0 = 0。异或操作可以满足。 本位的进位的结果为:1?1 = 1 1?0 = 0 0?0 = 0 。与操作可以满足。
两个数相加又可以递归来做。进位会越来越上进,所以右边的0越来越多。最后进位变成0(没有进位或者进位越界),递归终止。
比如: 1 1 1 1 1 0 0 1 + 0 0 0 0 1 1 0 0 ------------------------- = 1 1 1 1 0 1 0 1 (a^b) + 0 0 0 0 1 0 0 0 0 (a&b<<1) ------------------------- = 1 1 1 0 0 1 0 1 + 0 0 0 1 0 0 0 0 0 ------------------------- = 1 1 0 0 0 1 0 1 + 0 0 1 0 0 0 0 0 0 ------------------------- = 1 0 0 0 0 1 0 1 + 0 1 0 0 0 0 0 0 0 ------------------------- = 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 (a&b<<1得0了)
结果为:00000101。
【代码】
【结果】
|