#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),关于一段地址对齐的位运算代码的解释相关推荐

  1. 面部识别预处理全家桶:mtcnn人脸捕捉、人脸点对齐、仿射运算

    面部识别预处理全家桶:mtcnn人脸捕捉.人脸点对齐.仿射运算 人脸捕捉 人脸点对齐 仿射运算 python cpp 人脸捕捉 目前,人脸识别算是一个比较火的人工智能话题.实际上,对于所有的人脸相关问 ...

  2. 计算机语言mod(m n),密码技术与物联网安全:mbedtls开发实战最新章节_徐凯著_掌阅小说网...

    3.2 素数 定义3-1 设整数n≠0,±1,若除了因数±1和±n之外,n没有其他的因数,那么称n为素数(或质数或不可约数),否则n为合数. 例如,整数2.3.7都是素数,而4.6.10.15.32都 ...

  3. eclipse 注释星号没对齐_36 个奇葩代码注释,看完笑哭了!

    SO上有一个类似的问题,问大家见过哪些超秀的注释,不少程序员纷纷吐槽自己见过的那些逆天注释,我们一起来围观一下. 1.只有上帝知道 //我写这一行的时候,只有上帝和我知道我在写什么 //现在,只有上帝 ...

  4. Java8 函数式对齐约定————Eclipse自定义代码风格

    引言 Java8 的函数式代码风格在Stream的使用上尤为突出.尽管我们可以通过连续调用函数完成一系列操作,但是其可读性并不能保证,还需要有与之相辅的Code Style.例如,请尝试阅读下面两段完 ...

  5. ACM MM2021 HANet:从局部到整体的检索!阿里提出用于视频文本检索的分层对齐网络HANet!代码已开源!...

    关注公众号,发现CV技术之美 ▊ 写在前面 视频-文本检索是视觉语言理解中一项重要但具有挑战性的任务,它旨在学习一个相关的视频和文本实例相互接近的联合嵌入空间.目前的大多数工作都只是基于视频级和文本级 ...

  6. vbe代码对齐插件_写代码需要注意的问题

    代码质量不仅体现在逻辑上,也要体现在形式上.尤其前端代码,在日渐复杂的单页面开发中,代码格式化不仅是为了美观,也是为了更好的阅读及检查.关于代码的格式化并没有统一的标准,每个人都有自己的见解. 但是很 ...

  7. c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践

    uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...

  8. [No000089]String的(补空位)左对齐,(补空位)右对齐

    using System;namespace Chinese中文排序Sort {internal class Program{/// <summary>/// 取子字符串/// </ ...

  9. vim代码对齐命令_vim让代码整齐美观的小技巧

    一.空格和Tab相关 空格和Tab是两种常见的排版缩进的字符,常见项目中的风格问题往往由此而起.vim可以很容易的处理好这些问题.首先我们要把这两个字符显示出来,默认这两个字符都是白的.使用如下方法设 ...

最新文章

  1. Spring Boot中自带的这些工具类,你用过几个?
  2. 【MM模块】 Info Record 采购信息记录
  3. c++ 输出二进制_Python之输入输出(input_output)
  4. 【AWSL】之Linux引导过程及服务控制(MBR、GRUB、runlevel、systemcl、init、ntsysv、chkconfig)
  5. java培训第一阶段测试总结_java学习的第一阶段总结
  6. WebSocket服务器上的oTransactionID_SiteDetailMap的qrcode是何时生成的
  7. STL set和multiset
  8. Structual设计--Flyweight模式
  9. 交互式内核图 -***
  10. IntelliJ Idea 常用快捷键 超实用!
  11. [C#]C#补习——控制流语句相关
  12. 内是不是半包围结构_什么是结构化面试、无领导小组讨论、结构化小组面试?教你快速搞懂国考面试三大形式。...
  13. Spring全家桶视频教程
  14. 微信小程序轮播图实现(超简单)
  15. 家与年:解读中国文化的深层密码
  16. redis中使用GeoHash
  17. 小程序加盟怎么样?加盟小程序赚钱吗?
  18. ICLR 2022 | 商汤提出cosFormer:在注意力中重新思考Softmax
  19. kotlin_基础_密封类(sealed)
  20. “火星人”马斯克推论:世界很大可能性是被编程的,上帝可能是个程序员!

热门文章

  1. html5拍照上传 java_如何使用HTML5实现拍照上传应用
  2. python dbscan 如何确定eps参数_如何选择eps和minPts(DBSCAN算法的两个参数)以获得有效结果?...
  3. 成功解决SQL Server软件中出现的18456问题
  4. BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
  5. Py之portalocker:portalocker的简介、安装、使用方法之详细攻略
  6. Python的IDE:利用MyEclipse2017软件的PyDev插件实现Python编程
  7. 成功解决 ValueError: feature_names mismatch training data did not have the following fields
  8. java实体 和 xml相互转换
  9. 学写网站(一)前端配置之安装nvm、node、npm
  10. CSAPP:第三章程序的机器级表示1