在存储的时候,为了提高效率,一般都会让偏移量落在2的m次方的位置上,而且常有向上取整和向下取整两种需求。
向下取整
PALIGN_DOWN(x,align)  (x & (- align))
 
这样做为什么可以,因为align 取反 还是自己,只是高位全变成1了,然后再和原来的数&运算,此时不对齐多出来的1都被清0了。
PALIGN_UP(x,align) (-(-x) & (-align))
原理也比较容易推断,将x变成负数,那么对-x 向下取反,得到的数是向下取反的负数,但是再加一个负号,负负得正,获得了一个更大的整数
实现了向上取整。
相当于 PALIGN_UP(x,align) =====> -PALIGN_DOWN(-x,align)

PALIGN_DOWN向下取整例子:

4二进制:

0000 0100

1111 1100

如果x是3, 011,和-align相与后为0

如果x是5,101,相与后是4.

一篇文章:

内存对齐算法

字节对齐是在分配内存时需要考虑的问题,两个小算法:

(1)最容易想到的算法:

  1. unsigned int calc_align(unsigned int n,unsigned align)
  2. {
  3. if ( n / align * align == n)
  4. return n;
  5. return  (n / align + 1) * align;
  6. }

(2)更好的算法:

  1. unsigned int calc_align(unsigned int n,unsigned align)
  2. {
  3. return ((n + align - 1) & (~(align - 1)));
  4. }

对于2算法原理如下:

2字节对齐,要求地址位为2,4,6,8...,要求二进制位最后一位为0(2的1次方)
4字节对齐,要求地址位为4,8,12,16...,要求二进制位最后两位为0(2的2次方)
8字节对齐,要求地址位为8,16,24,32...,要求二进制位最后三位为0(2的3次方)
16字节对齐,要求地址位为16,32,48,64...,要求二进制位最后四位为0(2的4次方)
...
由此可见,我们只要对数据补齐对齐所需最少数据,然后将补齐位置0就可以实现对齐计算。
 
(1)(align-1),表示对齐所需的对齐位,如:2字节对齐为1,4字节为11,8字节为111,16字节为1111...
(2)(x+(align-1)),表示x补齐对齐所需数据      
(3)&~(align-1),表示去除由于补齐造成的多余数据
(4) (x+(align-1))&~(align-1),表示对齐后的数据
 
举个例子:如8字节对齐。起始地始是6
6 + (8 - 1)=0000 0110 + 0000 0111 = 0000 1101
0000 1101 & ~(0000 0111) = 0000 1000  //去除由于补齐造成的多余数据
 

最新文章

  1. Storyboard & XIB 自己的理解
  2. React虚拟DOM浅析
  3. Nancy之文件上传与下载
  4. ORACLE 移动数据文件 控制文件 重做日志文件
  5. (转)Jquery最实用的实例及源码(http://www.cnblogs.com/kingfly/archive/2012/12/05/2802539.html)
  6. 解决MyEclipse报错问题
  7. 31、springmvc(注解)
  8. zabbix通过curl命令判断web服务是否正常并自动重启服务
  9. 通过ping确定网卡mtu
  10. HDU 1728 逃离迷宫(BFS)
  11. HDFS2.x之RPC流程分析
  12. hadoop1中mapreduce原理详解
  13. 基于cx_freeze编译PyQt4程序(numpy & scipy)
  14. C# -- 什么是方法签名?
  15. js,jQuery获取html5的data-*属性
  16. kubenetes 环境的塔建
  17. Android 框架 Afinal使用
  18. Windows下文件加固
  19. LINUX下PHP网页生成快照(截屏)(xvfb and wkhtmltoimage)
  20. java list按照 对象 指定多个字段属性进行排序

热门文章

  1. RT-Thread信号量实际运用—按键点灯
  2. 基于s5pv210的uboot总结
  3. The Dataflow Model 论文
  4. mysql 存储过程 php版本
  5. [收藏]ASP.NET MVC管道详述
  6. nrf51822裸机教程-SPI(主)
  7. Lambda中的一些方法的总结
  8. 在express中使用Mongoose连接MongoDB
  9. 用Quartz处理定时执行的任务
  10. Asset Store