2013-10-15 1 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 является один меньше, чем выравнивание вы SEEK), чтобы гарантировать, что все биты высокого порядка уже присутствует в ваших числах являются правильно держали освещены после выравнивания, включая биты толкаемых там операция добавления. Фактическое округление для выравнивания выполняется добавлением 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 

Я должен обратите внимание, что это не обеспечивает реальной защиты от переполнения, за исключением того, что сторона вызова проверяет значение с нулевым возвратом, whi ch, очевидно, не будет тем, что вы хотели бы использовать в качестве значения выравнивания округления.

11111110 : 254 
+ 00000111 : 7 
    -------- ---- 
    00000101 : 5 (of) 
& 11111000 : ~7 
    -------- ---- 
    00000000 : 0 
Смежные вопросы