我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不

允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注

意:该方法只对除数是2的N次方幂时才有效。

在移位运算中我们可知,计算机中的数据都是0和1的序列,当我们把某个数字左

移一位,该数字会扩大为原来的2倍;而将其右移一位时,该数字就会缩小为原来的1/2,

即相当于对该数字做了一次被2整除的运算。

举例说明:

11的二进制是1011,如果右移一位的话,将变成0101,也就是5。

现在我们考虑11除以8的余数,很显然是3;因为8是2的3次幂,求余时相当于除

以2的3次幂,也就是把1011右移3位,该过程会把1011的低3位011给移走,事实上,这个

被移走的011就是11除以8的余数!但是,我们该如何把这个011给保存下来呢?

现在的问题就转化为如何保存11的二进制1011的低三位数字了——这时就是按位

与运算出马的时候了!和1做与运算会保存原来的数字,所以我们就可以用1011&0111来计

算。那么这个0111又是如何得到的呢?有两种方法,第一种是2^N-1,比如8按照此公式就

得出了0111;第二种是8的二进制取反,即1000取反得到0111。

综上所述,位运算求余一定要注意,只适合于除数是2的N次方的情况。其原理就

是:对2的N次方求余,就预示着数字将向右移N位;这被右移的N位,就是余数!只要我们

再用与运算将这N位保存下来即可!

设X对Y求余,Y等于2^N,公式为:X & (2^N - 1)或X&(~Y)。

转载:https://blog.csdn.net/wangwenzhi276/article/details/43853617

最新文章

  1. C语言:socket简单模拟http请求
  2. CentOS 6.5、6.7 设置静态 ip 教程
  3. POJ 2001 Shortest Prefix
  4. EF实体框架之CodeFirst七
  5. js TAb
  6. 发布ASP.NET网站到IIS
  7. Error on SVN checkout:SSL handshake failed
  8. C#核编之字符串类型介绍与操作
  9. 【CentOS如何最小化安装】
  10. Ext JS 6学习文档–第1章–ExtJS入门指南
  11. 这是对position讲解最通俗易懂的版本了。
  12. 网络服务器操作命令telnet
  13. android的消息通知栏
  14. jmeter知识总结(一)
  15. echarts使用笔记一:基本属性
  16. ATM目录结构
  17. velocity 框架
  18. UVALive 5059 C - Playing With Stones 博弈论Sg函数
  19. HTML5中的Web Storage(sessionStorage||localStorage)理解与简单实例
  20. 深入理解 Express.js

热门文章

  1. Nowcoder Monotonic Matrix ( Lindström–Gessel–Viennot lemma 定理 )
  2. CodeForces 557C Arthur and Table STL的使用
  3. G. Gangsters in Central City
  4. Pod初始化容器之Init Container
  5. python解析字体反爬
  6. Python列表解析和字典解析
  7. linux系统基础优化及高级操作命令
  8. oracle存储过程及sql优化-(三)
  9. python3笔记三:运算符与表达式
  10. 多个swiper使用样式出了问题