_INTSIZEOF(n)
来源:互联网 发布:mmdR18动作数据 编辑:程序博客网 时间:2024/05/06 18:56
转自:http://blog.csdn.net/sdcxyz/article/details/7067699
其实这个很简单。。不过位运算效率高点。 其实就是为了实现 (x+n-1)/n *n 的功能,(x+n-1)/n 与x/n比较显而易见就是保证商是不小于结果的最小整数.7/2 = 3(计算机中),但我们想要4 所以就需要(7+2-1)/2 = 4; 下面就是_INTSIZEOF(n)位运算的理解了
定义:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
1 我们知道对于IX86,sizeof(int)一定是4的整数倍,所以~(sizeof(int) - 1) )的值一定是
右面[sizeof(n)-1]/2位为0,整个这个宏也就是保证了右面[sizeof(n)-1]/2位为0,其余位置
为1,所以_INTSIZEOF(n)的值只有可能是4,8,16,......等等,实际上是实现了字节对齐。
2 #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
的目的在于把sizeof(n)的结果变成至少是sizeof(int)的整倍数,这个一般用来在结构中实现按int的倍数对齐。
如果sizeof(int)是4,那么,当sizeof(n)的结果在1~4之间是,_INTSIZEOF(n)的结果会是4;当sizeof(n)的结果在5~8时,
_INTSIZEOF(n)的结果会是8;当sizeof(n)的结果在9~12时,_INTSIZEOF(n)的结果会是12;……总之,会是sizeof(int)的倍数。
理论基础:
对于两个正整数 x, n 总存在整数 q, r 使得
x = nq + r, 其中 0<= r <n //最小非负剩余
q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.
所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 这也相当于把 x 表示为:
x = nq + r', 其中 -n < r' <=0 //最大非正剩余
nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:
x+n = qn + (n+r'),其中 0<n+r'<=n //最大正剩余
x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n //最小非负剩余
所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:
((x+n-1)/n)*n
若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:
(x+n-1) & (~(n-1))
- _INTSIZEOF(n)
- _INTSIZEOF(n)
- _INTSIZEOF(n)
- _INTSIZEOF(n)
- _INTSIZEOF(n)
- 内存对齐 _INTSIZEOF(n)
- _INTSIZEOF(n) 原理
- #define _INTSIZEOF(n)
- _INTSIZEOF
- 内存对齐#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
- 内存对齐#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
- #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 的解释
- 内存对齐#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) .
- 内存对齐#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
- C语言中的宏 #define _INTSIZEOF(n) 与 可变参数函数
- c语言中可变参数中_INTSIZEOF(n)宏的解释
- 宏 _INTSIZEOF 的意思
- _INTSIZEOF 及windows 核心编程ch5
- Python转义字符
- 黑马程序员——Java基础(四)之方法、数组
- SVN服务器搭建和使用(三)
- AttributeError: 'WebDriver' object has no attribute
- 算法导论 KMP字符串匹配
- _INTSIZEOF(n)
- POJ 3714 Raid(求两集合之间的最近点对)
- mysql 存储引擎
- SVN服务器搭建和使用(四)
- 图像识别中的深度学习
- jconsole监控tomcat运行状态
- 关于Glide——一个高效的图片加载和缓存类库
- URAL 1205 By the Underground or by Foot (建图 + Dijkstra迪杰斯特拉算法)
- #12 LeetCode——Integer to Roman