计算机语言mod(m n),关于一段地址对齐的位运算代码的解释
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //为了满足需要内存对齐的系统
这段代码有些难以理解。那么慢慢分析下吧。
假设有一个地址n,要把n按m对齐,无非就是找到大于等于n且整除m的最小的那个数。
我们定义一个宏函数F,它计算n按m对齐的结果,则按照上段代码的逻辑,F定义为:
#define F(n, m) (n+m-1)&~(m-1)
这段代码如果不用这种按位与来写,其实可以这么写:
#define F(n, m) (n+m-1)/m*m
以上的做法正确性可以分情况证明:
(为了说明问题方便,由于计算机里的除法和严格的数学意义上的除法是不一样的,我们这里以"/"表示计算机里的除法,"%"表示严格的数学除法,"mod"表示取模运算。之后也遵循这个惯例,只是代码还是遵循计算机语言本身的规范。)
1.如果n是能整除m的,那么结果应该就是n,能得出F(n, m)的结果正确;
2.如果n不能整除m,那么结果应该是n - n mod m + m。由于n - n mod m + m能整除m,所以我们只需要证(n - n mod m + m)/m等于(n+m-1)/m。也即证
0<= (n+m-1) - (n - n mod m + m) < m
上面这个式子很显然。
当我们反过来再看计算机里的除法"/"时,发现,实际上,对于被除数x与除数y,有:
x/y = (x - x mod y) % y
设a=n+m-1,有
(n+m-1)/m*m = a/m*m = (a - a mod m)%m*m = a - a mod m
实际上,只要证
a&~(m-1) = a - a mod m
当然,这里的前提是,m是2的幂次。
这里假设m=2^q。那么m的二进制表示一定是1后面跟q个0。m-1则为最后面q位为1,前面全为0,按位取反结果是后面q位为0,前面为1。
由于m是2的幂次,故a mod m结果就是a的二进制表示的最后q位结果。而a按位与一个前面全为1后q位为0的二进制数,则正好就是减去了后q位,等同于减去a对m的余数。
故得证。
原文:http://www.cnblogs.com/waytofall/p/4109514.html
计算机语言mod(m n),关于一段地址对齐的位运算代码的解释相关推荐
- 面部识别预处理全家桶:mtcnn人脸捕捉、人脸点对齐、仿射运算
面部识别预处理全家桶:mtcnn人脸捕捉.人脸点对齐.仿射运算 人脸捕捉 人脸点对齐 仿射运算 python cpp 人脸捕捉 目前,人脸识别算是一个比较火的人工智能话题.实际上,对于所有的人脸相关问 ...
- 计算机语言mod(m n),密码技术与物联网安全:mbedtls开发实战最新章节_徐凯著_掌阅小说网...
3.2 素数 定义3-1 设整数n≠0,±1,若除了因数±1和±n之外,n没有其他的因数,那么称n为素数(或质数或不可约数),否则n为合数. 例如,整数2.3.7都是素数,而4.6.10.15.32都 ...
- eclipse 注释星号没对齐_36 个奇葩代码注释,看完笑哭了!
SO上有一个类似的问题,问大家见过哪些超秀的注释,不少程序员纷纷吐槽自己见过的那些逆天注释,我们一起来围观一下. 1.只有上帝知道 //我写这一行的时候,只有上帝和我知道我在写什么 //现在,只有上帝 ...
- Java8 函数式对齐约定————Eclipse自定义代码风格
引言 Java8 的函数式代码风格在Stream的使用上尤为突出.尽管我们可以通过连续调用函数完成一系列操作,但是其可读性并不能保证,还需要有与之相辅的Code Style.例如,请尝试阅读下面两段完 ...
- ACM MM2021 HANet:从局部到整体的检索!阿里提出用于视频文本检索的分层对齐网络HANet!代码已开源!...
关注公众号,发现CV技术之美 ▊ 写在前面 视频-文本检索是视觉语言理解中一项重要但具有挑战性的任务,它旨在学习一个相关的视频和文本实例相互接近的联合嵌入空间.目前的大多数工作都只是基于视频级和文本级 ...
- vbe代码对齐插件_写代码需要注意的问题
代码质量不仅体现在逻辑上,也要体现在形式上.尤其前端代码,在日渐复杂的单页面开发中,代码格式化不仅是为了美观,也是为了更好的阅读及检查.关于代码的格式化并没有统一的标准,每个人都有自己的见解. 但是很 ...
- c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践
uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...
- [No000089]String的(补空位)左对齐,(补空位)右对齐
using System;namespace Chinese中文排序Sort {internal class Program{/// <summary>/// 取子字符串/// </ ...
- vim代码对齐命令_vim让代码整齐美观的小技巧
一.空格和Tab相关 空格和Tab是两种常见的排版缩进的字符,常见项目中的风格问题往往由此而起.vim可以很容易的处理好这些问题.首先我们要把这两个字符显示出来,默认这两个字符都是白的.使用如下方法设 ...
最新文章
- Spring Boot中自带的这些工具类,你用过几个?
- 【MM模块】 Info Record 采购信息记录
- c++ 输出二进制_Python之输入输出(input_output)
- 【AWSL】之Linux引导过程及服务控制(MBR、GRUB、runlevel、systemcl、init、ntsysv、chkconfig)
- java培训第一阶段测试总结_java学习的第一阶段总结
- WebSocket服务器上的oTransactionID_SiteDetailMap的qrcode是何时生成的
- STL set和multiset
- Structual设计--Flyweight模式
- 交互式内核图 -***
- IntelliJ Idea 常用快捷键 超实用!
- [C#]C#补习——控制流语句相关
- 内是不是半包围结构_什么是结构化面试、无领导小组讨论、结构化小组面试?教你快速搞懂国考面试三大形式。...
- Spring全家桶视频教程
- 微信小程序轮播图实现(超简单)
- 家与年:解读中国文化的深层密码
- redis中使用GeoHash
- 小程序加盟怎么样?加盟小程序赚钱吗?
- ICLR 2022 | 商汤提出cosFormer:在注意力中重新思考Softmax
- kotlin_基础_密封类(sealed)
- “火星人”马斯克推论:世界很大可能性是被编程的,上帝可能是个程序员!
热门文章
- html5拍照上传 java_如何使用HTML5实现拍照上传应用
- python dbscan 如何确定eps参数_如何选择eps和minPts(DBSCAN算法的两个参数)以获得有效结果?...
- 成功解决SQL Server软件中出现的18456问题
- BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
- Py之portalocker:portalocker的简介、安装、使用方法之详细攻略
- Python的IDE:利用MyEclipse2017软件的PyDev插件实现Python编程
- 成功解决 ValueError: feature_names mismatch training data did not have the following fields
- java实体 和 xml相互转换
- 学写网站(一)前端配置之安装nvm、node、npm
- CSAPP:第三章程序的机器级表示1