
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
14.09.2016, 17:11:48
|
|||
|---|---|---|---|
битовые поля в структурах 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:18:01
|
|||
|---|---|---|---|
битовые поля в структурах c++ |
|||
|
#18+
делать что-то типа Код: plaintext 1. 2. 3. 4. 5. не красиво :/ есть ещё варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.09.2016, 17:19:09
|
|||
|---|---|---|---|
битовые поля в структурах c++ |
|||
|
#18+
nop, Порядок байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.09.2016, 17:20:57
|
|||
|---|---|---|---|
|
|||
битовые поля в структурах c++ |
|||
|
#18+
http://en.cppreference.com/w/cpp/language/bit_field Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2016, 02:28:34
|
|||
|---|---|---|---|
|
|||
битовые поля в структурах 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, 08:19:12
|
|||
|---|---|---|---|
битовые поля в структурах c++ |
|||
|
#18+
Пётр Седов, С ними понятнее и чище код, чем собирать побитово какой нибудь IP64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2016, 09:02:37
|
|||
|---|---|---|---|
битовые поля в структурах 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, 17:32:53
|
|||
|---|---|---|---|
битовые поля в структурах 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, 20:12:25
|
|||
|---|---|---|---|
|
|||
битовые поля в структурах c++ |
|||
|
#18+
White OwlТы путаешь целое и строку. "\x08\x03" и 0x0803 это разные вещи. Наоборот, он как раз сказал, что "\x08\x03" это 0x0308 )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.09.2016, 06:35:51
|
|||
|---|---|---|---|
битовые поля в структурах 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 это разные вещи.Это не я путаю, это автор пытается интерпретировать строку как целое число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2016, 21:38:19
|
|||
|---|---|---|---|
|
|||
битовые поля в структурах c++ |
|||
|
#18+
Siemargl, ещё одно преимущество bitfield-ов -- их легко в отладчике смотреть. nop, если очень хочется именно bitfield-ы, можно так попробовать: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/search_topic.php?author=Deck&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
13ms |
get forum list: |
27ms |
get settings: |
18ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
41ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 818ms |
| total: | 1029ms |

| 0 / 0 |
