C语言学习笔记之位运算求余
来源:互联网 发布:原来淘宝流量下滑 编辑:程序博客网 时间:2024/06/04 18:01
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是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)。
- C语言学习笔记之位运算求余
- 黑马程序员----C 语言学习笔记之位运算符
- C语言基础 求余运算
- C语言学习笔记11--位运算
- C语言学习笔记 位运算
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- C语言除法运算符“/”和求余运算符“%”
- 求余运算转换为位运算
- 求余运算转换为位运算
- C语言的除法运算:整除/和求余%
- C语言中的位运算&结构体浅析 — <编程之美>1.2学习笔记
- C语言之位运算
- C语言之位运算
- D. R2D2 and Droid Army(two pointers)
- 明明的随机数
- hdu 1007 Quoit Design
- 开心的金明
- 收集宝藏
- C语言学习笔记之位运算求余
- 服务器架设笔记——打通MySQL和Apache
- hdu1281---棋盘游戏
- poj--3630+字典树基础题
- android系统的常用权限
- 如何在WORDPRESS中添加CNZZ等统计代码
- 解决WORDPRESS 4.1版本不显示ICP备案号的问题
- JPype
- WORDPRESS 中 GOOGLE 字体的最佳替代方案