Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
Добрый всем день. Столкнулся с такой проблемой. У меня есть двухбайтовая переменная, которую надо разделить на 2 переменные размером 5 бит и 11 бит. Для этой цели я создал простенькую структуру: Код: plaintext 1. 2. 3. 4. 5. 6. Проверяю: Код: plaintext 1. 2. В s->value1 должна быть единица, потому что в бинарном виде мы имеем: 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 Где жирным - те самые 5 бит. Но в s->value1 лежит цифра 8, что соответствует 0 0 0 0 1 0 0 0, то есть почему-то в value1 записывается целый байт вместо 5-ти бит. Собственно, вопрос. Почему? Я предполагаю, что между value1 и value2 ещё лежат 3 неиспользованных бита (для выравнивания, т.к. структура весит 3 байта вместо 2-ух). Если я прав, то как можно эти три бита объединить с value2? То есть чтобы вся структура имела реальный размер в памяти 2 байта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2016, 17:11 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
делать что-то типа Код: plaintext 1. 2. 3. 4. 5. не красиво :/ есть ещё варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2016, 17:18 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
nop, Порядок байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2016, 17:19 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
http://en.cppreference.com/w/cpp/language/bit_field Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2016, 17:20 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
nop, да не мучайтесь вы с этими bitfield-ами, они по-разному реализованы в разных компиляторах, плюс заморочки с little-endian/big-endian (хотя big-endian архитектуры видимо почти вымерли). В C++ есть inline функции-члены, что делает C-шные bitfield-ы практически ненужными: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 02:28 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, С ними понятнее и чище код, чем собирать побитово какой нибудь IP64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 08:19 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
nopДобрый всем день. Столкнулся с такой проблемой. У меня есть двухбайтовая переменная, которую надо разделить на 2 переменные размером 5 бит и 11 бит. Для этой цели я создал простенькую структуру: Код: plaintext 1. 2. 3. 4. 5. 6. Проверяю: Код: plaintext 1. 2. В s->value1 должна быть единица, потому что в бинарном виде мы имеем: 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 Где жирным - те самые 5 бит. Но в s->value1 лежит цифра 8, что соответствует 0 0 0 0 1 0 0 0, то есть почему-то в value1 записывается целый байт вместо 5-ти бит. Собственно, вопрос. Почему? Я предполагаю, что между value1 и value2 ещё лежат 3 неиспользованных бита (для выравнивания, т.к. структура весит 3 байта вместо 2-ух). Если я прав, то как можно эти три бита объединить с value2? То есть чтобы вся структура имела реальный размер в памяти 2 байта. Всё не так. "\x08\x03" в бинарном виде - 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0. Первым идет младший байт. (Хотя это зависит от процессора, но на x86 вот так). Битовые поля компилятор тоже выделяет начиная с младших битов (но это может зависеть от компилятора). Так что value1 у вас не старшие, а младшие 5 битов. Действительно 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 09:02 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
BarloneВсё не так. "\x08\x03" в бинарном виде - 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0. Первым идет младший байт. (Хотя это зависит от процессора, но на x86 вот так). Битовые поля компилятор тоже выделяет начиная с младших битов (но это может зависеть от компилятора). Так что value1 у вас не старшие, а младшие 5 битов. Действительно 8.Ты путаешь целое и строку. "\x08\x03" и 0x0803 это разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:32 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
White OwlТы путаешь целое и строку. "\x08\x03" и 0x0803 это разные вещи. Наоборот, он как раз сказал, что "\x08\x03" это 0x0308 )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 20:12 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
White OwlBarloneВсё не так. "\x08\x03" в бинарном виде - 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0. Первым идет младший байт. (Хотя это зависит от процессора, но на x86 вот так). Битовые поля компилятор тоже выделяет начиная с младших битов (но это может зависеть от компилятора). Так что value1 у вас не старшие, а младшие 5 битов. Действительно 8.Ты путаешь целое и строку. "\x08\x03" и 0x0803 это разные вещи.Это не я путаю, это автор пытается интерпретировать строку как целое число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 06:35 |
|
||
|
битовые поля в структурах c++
|
|||
|---|---|---|---|
|
#18+
Siemargl, ещё одно преимущество bitfield-ов -- их легко в отладчике смотреть. nop, если очень хочется именно bitfield-ы, можно так попробовать: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2016, 21:38 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39309826&tid=2018426]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 166ms |

| 0 / 0 |
