2013-10-15 34 views
1

我想知道爲什麼下面的宏爲C中的數據對齊工作? #define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))說如果n等於7爲什麼下面的宏應該工作? #define ALIGN8(x) (size_t)((~7)&((x)+7)。你能用一些例子來展示它,並告訴爲什麼這個公式有效嗎?數據對齊是否還有其他有形公式?如何在C中進行數據對齊?

+2

您是否在一張紙上繪製了這些位並查看每個步驟的作用? – WhozCraig

回答

2

的目的~N(其中N是一個不到你所尋求的對齊),是確保所有的高序位已經存在於你的電話號碼是正確保持對齊後點燃,其中包括推位通過添加操作。通過加入N來完成對齊的實際舍入。這確保將任何合適的進位比特推入更高的比特位置,然後保證按位與AND保證保留,同時確保底部比特被清除,因爲他們不需要。

想象一下:

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 

我應該請注意,除了調用方檢查零回報值,這不提供對溢出的實際保護ch顯然不是你希望用作四捨五入對齊值的。

11111110 : 254 
+ 00000111 : 7 
    -------- ---- 
    00000101 : 5 (of) 
& 11111000 : ~7 
    -------- ---- 
    00000000 : 0 
相關問題