C语言学习笔记之位运算求余
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是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)。
--------------------- 本文来自 RisingSunny 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wangwenzhi276/article/details/43853617?utm_source=copy
C语言学习笔记之位运算求余的更多相关文章
- c语言小技巧:C语言学习笔记之位运算求余
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不 允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注 意:该方法只对除数是2的N次方幂时才有效 ...
- TCP/IP详解学习笔记 这位仁兄写得太好了.(转载)
TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记 这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/20444 ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
- Go语言学习笔记(1)——顺序编程
Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- 2017-05-4-C语言学习笔记
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
随机推荐
- MobX+react使用小demo
第一次接触mobx,网上找了很多例子,写此主要总结一下create-react-app + mobx入门 create-react-app myreact cd myreact npm install ...
- Vue组件化应用构建 官网例子 Unknown custom element: <todo-item>
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...
- union、union all 、distinct的区别和用途
1.从用途上讲 它们都具有去重的效果 2.从效率上讲 distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出 ...
- lunx中部分命令总结
一.文件和目录操作命令ls 全拼list,功能是列出目录的内容及其内容属性信息. cd 全拼change directory,功能是从当前工作目录切换到指定的工作目录. cp 全拼copy,其功 ...
- maven快速自动更新子模块项目的版本号
当一个版本发布,新起一个版本时,我们需要更改一下项目中的版本号.一个maven工程,如果只是一个单一的主项目,那么只要手动修改一下 pom.xml 就 可以了,耗不了多少时间.但是如果这个maven项 ...
- Adobe Flash Player 29.0.0.140官方正式版
Adobe Flash Player 29 正式版例行更新,v29.0.0.140 这是最新详细版本号,Adobe采取和微软相似的更新策略,在每个月的第二个周二为产品发布安全更新.Adobe® Fla ...
- spring Onions and wine
Before and after the cold dew, the air is drier and the "autumn dryness" is vulnerable. Nu ...
- GMT5 install
there are two imporant modules called gshhg and dcw when installing GMT5; try to state the locations ...
- C++面试笔记(1)
1. C和C++的区别 C++面向对象的三大特性 面向对象的三个基本特征:封装.继承.多态 1.封装:把客观事物封装成抽象的类,类进行信息隐藏 关键字 |当前类 |包内 |子孙类| 包外 --|--| ...
- c++ cin cin.getline() getline()用法
http://www.cnblogs.com/AndyJee/p/3821067.html 主要内容: 1.cin用法 2.cin.getline()用法 3.getline()用法 3.注意的问题 ...