[toc]
概 述
开门见山,
如果对 1除以2,那么直接右移一位就完事了。0x1 >> 1 == 0
如果对-1除以2,那么直接右移是不行的,因为 0xF >> 1 == -1
右移之后还是 -1,不会改变原本的值。
解决办法
对负数添加一个偏移量,公式是 如果要右移k位,那么用被除数的补码加上 2^k - 1,再右移就完事了。
比如 -1除以2是右移1位,那么-1 + 1 == 0
,再右移就得到了0 。
比如 -3除以2是右移1位,那么0xD(1101) + 1 == 0xE(1110)
,再右移就得到了 -1 。
至于原理我也不懂,感觉这个背过就行了。
尽量避免除法
除法是计算机运算里面要极力避免的一件事,尤其是追求性能的系统,比如嵌入式。一个除法大概要消耗几百个时钟,这是对性能的极大浪费。所以能用右移尽量转换成右移。