Мне нужно создать объединение, которое позволило бы мне (и отображать) каждый бит из определенного байта. Это даже имеет смысл? Я думаю, что знаю, как это сделать с побитовыми операторами, но не знаю, как использовать союзы для одного и того же эффекта.C Union - отображение всех 8 бит байта
ответ
Рекомендуется использовать побитовые операции. Вы можете комбинировать соединение и битовые поля для извлечения битов тоже, но обратите внимание, что это порядок байт-зависимая, поэтому это не рекомендуется, образец здесь для обучения, хотя:
#include <stdio.h>
#include <string.h>
union Bits {
char b;
struct bits {
#ifdef LITTLE_ENDIAN
unsigned int b0: 1;
unsigned int b1: 1;
unsigned int b2: 1;
unsigned int b3: 1;
unsigned int b4: 1;
unsigned int b5: 1;
unsigned int b6: 1;
unsigned int b7: 1;
#else
// reverse the order of the bit fields.
#endif
} bits;
};
int main(void) {
char a = 'A';
union Bits b;
b.b = a;
printf("0x%x\n", a);
printf("%d%d%d%d%d%d%d%d\n", b.bits.b7, b.bits.b6, b.bits.b5, b.bits.b4, b.bits.b3, b.bits.b2, b.bits.b1, b.bits.b0);
return 0;
}
Это должен вывести
0x41
01000001
Нет. Вы не можете указать, какие битовые поля заказа будут. Порядок бит-полей определяется реализацией. Per ** 6.7.2.1 Специфика структуры и союза **, пункт 11 стандарта [C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf): " ... Порядок распределения бит-полей внутри единицы (от 0 дос низким или низким порядком) определяется положением. ... » –
Реализация определена, поэтому Я сказал, что это зависит от сущности и не переносимости, я никогда не говорил, что можно указать порядок бит. :) – fluter
Это зависит не только от контенту - разные компиляторы могут и по-разному обрабатывать бит-поля. Поэтому вы не можете точно знать, какой бит это. Некоторые из них даже прикручивают его: https://lwn.net/Articles/478657/ –
Вы можете использовать объединение unit8_t
и struct
, содержащее 8 однобитовых битовых полей. Однако, даже если это даст вам доступ к отдельным битам, вы не узнаете, какие биты они есть! Это будет зависеть от того, как ваш компилятор назначает битовые поля базовому байту, что может зависеть от конечности вашего целевого компьютера.
См. this SO Q&A.
** вы не узнаете, какие они есть! ** Спасибо, что указали это. –
С C99, мы имеем анонимные структуры и союзы, что делает вещи проще:
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
union disByte
{
uint8_t byte;
// Assuming little endian
struct {
bool b0: 1;
bool b1: 1;
bool b2: 1;
bool b3: 1;
bool b4: 1;
bool b5: 1;
bool b6: 1;
bool b7: 1;
};
};
int main()
{
union disByte foo;
foo.byte = 42;
printf("%d %d %d %d %d %d %d %d\n", foo.b0, foo.b1, foo.b2, foo.b3, foo.b4, foo.b5, foo.b6, foo.b7);
}
Однако манипуляции с битами обычно предпочитаются (Ваш вопрос меченого «битовая manipulati на").
#define XTH_BIT_OF(NUM, X) (bool)(NUM & (1U << X))
Преимущество использования битных манипуляций являются:
- Вам не нужно беспокоиться о байтах.
- Он выглядит короче и яснее.
Вы можете использовать битовое поле и союз, чтобы сделать это так:
#include <stdio.h>
typedef union {
struct {
unsigned int:0;
unsigned int firstBit : 1;
unsigned int secondBit : 1;
unsigned int thirdBit : 1;
unsigned int fourthBit : 1;
unsigned int fifthBit : 1;
unsigned int sixthBit : 1;
unsigned int seventhBit : 1;
unsigned int eigthBit : 1;
};
int raw;
} bitsOfByte;
int main()
{
bitsOfByte dt;
dt.raw = 254;
printf("Bits are %d/%d/%d/%d/%d/%d/%d/%d", dt.firstBit, dt.secondBit, dt.thirdBit, dt.fourthBit, dt.fifthBit, dt.sixthBit, dt.seventhBit, dt.eigthBit);
return 0;
}
Обратите внимание, что в этом варианте осуществления первый бит является нижний бит
Это относится к C99 –
- 1. Показать 8 бит байта в PHP
- 2. Создание байта (8 бит) из 4 2 бит
- 3. Бит до байта в
- 4. преобразование байта в бит
- 5. Печать бит байта
- 6. Эффективность извлечения бит из байта
- 7. Разделение 8-битного байта
- 8. Удалить последний бит байта
- 9. Как отменить бит байта?
- 10. Передайте каждый бит внутри байта
- 11. Получить определенный бит из байта
- 12. Z3: Как выбрать 4 байта из массива из 8 бит?
- 13. Захват n бит из байта
- 14. 8 бит перечисления, в C
- 15. Отображение PDF с байта [] в C#
- 16. Как вернуть бит из байта
- 17. Как пройти каждый бит байта
- 18. Объединить первые n бит байта с последними 8-n битами другого байта
- 19. C# UTF-8 Позиция байта в строке
- 20. Как получить значения бит из байта?
- 21. почему размер 1x1 8 бит bmp составляет 1082 байта. 24 бит составляет всего 58 байт?
- 22. Бит первого байта поэтапный после стеганографии
- 23. Отображение байта изображения в ретрансляторе
- 24. Как получить бит из байта в golang?
- 25. Как обновить бит в поле байта
- 26. uint8_t - 8 бит guarentee
- 27. C - бит последовательного порта, отличный от отправленного байта
- 28. C - Как проверить, есть ли 8 бит в 32 бит?
- 29. Как конвертировать 8 бит в 16 бит?
- 30. бит битрального байта с самым высоким битом
ли вы имеете в виду битовое поле вместо? Союзы не для этого. – fluter
Что случилось с использованием побитовых операторов? –