我想知道为什么以下宏可用于C中的数据对齐吗?#define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))
假设n等于7,为什么下面的宏应该起作用?#define ALIGN8(x) (size_t)((~7)&((x)+7)
。您可以举一些例子来说明这个公式为什么起作用吗?还有其他用于数据对齐的切实可行的公式吗?
的目的~N
(其中N是大于你所寻求的对齐少一个),是确保所有的高序位已经存在于你的电话号码被正确地保持对齐后点燃,包括位被推有通过添加操作。对齐的实际舍入是通过添加来完成的。N
这确保将任何适当的进位位压入较高位的位置,~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 : 240
我应该注意,除了调用方检查零返回值(这显然不是您要用作向上舍入的对齐值)之外,这没有提供真正的防止溢出的保护。
11111110 : 254
+ 00000111 : 7
-------- ----
00000101 : 5 (of)
& 11111000 : ~7
-------- ----
00000000 : 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句