位运算求a+b的和
今天无意中刷到这么个问题,代码如何书写网上已经非常多了,都只是说了位运算符等这些基础的操作,但是并没有很清楚说明代码为什么要这么写,(如果不清楚位运算的需要先百度一下位运算符)这里只针对这道题目梳理一下自己对这个问题的思考与想法
假设需要使用位运算符计算两个整数的和那么我们先用常规的计算方式试着计算一下:
假设 :a = 77,b = 55
那么将上面两个数转换成二进制,为了方便计算我们就将长度设置成8位如下:
a:0100 1101
b:0011 0111
常规的计算方式每位对其相加: 1 + 1 = 10(需要进1位), 0 +1 = 1,0 + 0 = 0
为了观察方便我们画一个表格查看
值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
a | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
b | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
过程1 | 1 | 需进位 | ||||||
过程2 | 1 | 需进位 | ||||||
过程3 | 1 | 需进位 | ||||||
过程4 | 1 | 需进位 | 余1 | |||||
过程5 | 1 | 需进位 | 余1 | |||||
过程6 | 1 | 需进位 | 余1 | |||||
过程7 | 1 | 需进位 | 余1 | |||||
结果 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
因为是2进制,在这个计算过程中我们发现了一些规律
1.整个计算过程中我们需要知道哪些位运算相加需要进位(需要&运算)
2.整个计算中过程1~7明显需要循环且发生位移(需要while循环且需要<<运算符)
3.需要保存每次位移的结果
这里我们就会想到需要a & b的运算从而得到些地方需要进位如下表所示:
a | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|---|---|---|
b | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
a&b | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
这里我们可以看到整个循环过程中这两个地方是一定会发生进位的我们先标记出来,然后我们在往下看,除了需要进位的地方外我们发现还有一些地方因为发生了进位但是还会有余数的地方