今天看到了一个关于负数取余的问题,然后就去c++ primer上找到了一些关于取余运算的知识:
取余运算只对整数有效,所以不讨论浮点数的问题。
假设我们需要求解 a%b
类型1:a,b同为正整数的情况
这种就很简单了。。例如 5%2 = 5 - (5/2)*2 = 1
类型2:a,b同为负整数
这种情况下,和正数一样计算,然后再取符号就可以了
例如:-5%-2 = -1
类型3:a,b一个为正数一个为负数
这时候根据机器而定的,如果a%b符号采用的是分子的符号,那么a/b的取整情况就是向0取整
例如:-21%5 ,如果采用的是分子符号,则结果为-1,那么-21/5 = -4
另一种情况则是取分母的符号
也就是-21%5 = 4,那么-21/5 = -5
我在我的机器上的试验结果是第一种情况(不信你可以试试)
正好看到了一篇关于汇编的帖子,觉得挺有道理
a%b = a - floor(a/b)*b
他里面解释floor是不大于a/b的最大整数,这种就是类型三的第二种
当然帖子中还提到了关于取余的汇编实现,我看到了一点优化的知识。
就是a%b中的b为2的整数次幂时,
a%b = a&(b-1)
以10%8为例 10 的二进制表示为1010,而8是0100,对于取余们只要关心比第三位小的位数,以为高位都可以是8的倍数。1010&0011结果为0010为2
有错误的请指出,谢谢。。
参考:http://www.zhihu.com/question/21070971/answer/17160896