我想知道为什么以下宏适用于 C 中的数据对齐?
#define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))
说如果 n 等于 7 为什么下面的宏应该起作用?#define ALIGN8(x) (size_t)((~7)&((x)+7)
. 你能用一些例子来展示它,并说明这个公式为什么有效吗?是否有任何其他有形的数据对齐公式?
问问题
2491 次
1 回答
2
的目的~N
(其中 N 比您寻求的对齐小一)是确保您的数字中已经存在的所有高位在对齐后保持点亮,包括通过添加操作推到那里的位。对齐的实际舍入是通过添加N
This 来~N
完成的不需要。
想象一下:
00100011 : 35
+ 00000111 : 7
-------- ----
00101010 : 42
& 11111000 : ~7
---------- ----
00101000 : 40
另一个例子:
11101111 : 239
+ 00000111 : 7
-------- ----
11110110 : 246
& 11111000 : ~7
-------- ----
11110000 : 240
最后,一个最终什么都不做的例子,因为它已经对齐了:
10100000 : 160
+ 00000111 : 7
-------- ----
10100111 : 167
& 11111000 : ~7
-------- ----
10100000 : 160
我应该注意到,除了调用方检查零返回值之外,这并没有提供真正的溢出保护,这显然不是您想要用作向上舍入对齐值的值。
11111110 : 254
+ 00000111 : 7
-------- ----
00000101 : 5 (of)
& 11111000 : ~7
-------- ----
00000000 : 0
于 2013-10-15T02:43:39.797 回答