2016-04-16 3 views
0

Мне нужно создать объединение, которое позволило бы мне (и отображать) каждый бит из определенного байта. Это даже имеет смысл? Я думаю, что знаю, как это сделать с побитовыми операторами, но не знаю, как использовать союзы для одного и того же эффекта.C Union - отображение всех 8 бит байта

+2

ли вы имеете в виду битовое поле вместо? Союзы не для этого. – fluter

+3

Что случилось с использованием побитовых операторов? –

ответ

1

Рекомендуется использовать побитовые операции. Вы можете комбинировать соединение и битовые поля для извлечения битов тоже, но обратите внимание, что это порядок байт-зависимая, поэтому это не рекомендуется, образец здесь для обучения, хотя:

#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 
+0

Нет. Вы не можете указать, какие битовые поля заказа будут. Порядок бит-полей определяется реализацией. Per ** 6.7.2.1 Специфика структуры и союза **, пункт 11 стандарта [C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf): " ... Порядок распределения бит-полей внутри единицы (от 0 дос низким или низким порядком) определяется положением. ... » –

+0

Реализация определена, поэтому Я сказал, что это зависит от сущности и не переносимости, я никогда не говорил, что можно указать порядок бит. :) – fluter

+0

Это зависит не только от контенту - разные компиляторы могут и по-разному обрабатывать бит-поля. Поэтому вы не можете точно знать, какой бит это. Некоторые из них даже прикручивают его: https://lwn.net/Articles/478657/ –

1

Вы можете использовать объединение unit8_t и struct, содержащее 8 однобитовых битовых полей. Однако, даже если это даст вам доступ к отдельным битам, вы не узнаете, какие биты они есть! Это будет зависеть от того, как ваш компилятор назначает битовые поля базовому байту, что может зависеть от конечности вашего целевого компьютера.

См. this SO Q&A.

+0

** вы не узнаете, какие они есть! ** Спасибо, что указали это. –

1

С 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)) 

Преимущество использования битных манипуляций являются:

  1. Вам не нужно беспокоиться о байтах.
  2. Он выглядит короче и яснее.
1

Вы можете использовать битовое поле и союз, чтобы сделать это так:

#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; 
} 

Обратите внимание, что в этом варианте осуществления первый бит является нижний бит

+0

Это относится к C99 –

Смежные вопросы