关于取余运算的一些细节问题

今天看到了一个关于负数取余的问题,然后就去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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值