Я хочу знать, почему следующий макрос работает для выравнивания данных в C? #define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))
Скажите, если n равно 7, почему должен работать следующий макрос? #define ALIGN8(x) (size_t)((~7)&((x)+7)
. Не могли бы вы показать это с некоторым примером и сказать, почему эта формула работает? Есть ли какая-либо другая осязаемая формула для выравнивания данных?Как выполнить выравнивание данных в C?
ответ
Цель из ~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
- 1. C: выравнивание структур данных
- 2. как выполнить выравнивание значений результата в python
- 3. Как выполнить быстрое выравнивание в python?
- 4. C++ выравнивание данных GLSL/набивка
- 5. Как выполнить функцию массива данных в C
- 6. Выравнивание столбцов набора данных в C
- 7. Выравнивание структуры в C++
- 8. Как выполнить выравнивание текста без использования «justify»?
- 9. Как выполнить горизонтальное выравнивание компонентов HTML
- 10. Как выполнить выравнивание по центру с поплавком
- 11. Выравнивание данных в таблице
- 12. Выравнивание структуры в C#
- 13. Выравнивание данных
- 14. Выравнивание данных в PHP/HTML
- 15. Странное выравнивание данных
- 16. C-программа - Структурирование переменных данных и выравнивание
- 17. Выравнивание структуры данных C++ STL, векторизация алгоритма
- 18. Выравнивание данных, содержащих строки
- 19. Как центрировать выравнивание заголовков данных
- 20. Выравнивание структуры в Visual C++
- 21. Это называется «выравнивание памяти» или «выравнивание данных»?
- 22. Как выполнить выравнивание выделения с помощью RichTextBox в Silverlight 4?
- 23. Как выполнить выравнивание кода в базе Eclipse Force.com IDE
- 24. Как установить выравнивание данных в Defaulttablemodel JTable?
- 25. C# - Выравнивание формы, как в Java Swing
- 26. Как выравнивание структур помогает в C?
- 27. Выравнивание данных в таблице ReportLab
- 28. Правое выравнивание цифр в c?
- 29. RTL выравнивание в itextsharp C#
- 30. Enforce Выравнивание памяти в C++
Вы нарисовали биты на листе бумаги и посмотрели, что делают каждый шаг? – WhozCraig