Есть ли способ получить доступ к отдельным битам с помощью объединения?

Я пишу программу на Си. Я хочу переменную, к которой я могу получить доступ как символ, но я также могу получить доступ к определенным битам. Я думал, что смогу использовать такой союз ...

typedef union 
{
    unsigned char status;
    bit bits[8];
}DeviceStatus;

, но компилятору это не нравится. Очевидно, вы не можете использовать биты в структуре. Так что я могу сделать вместо этого?

16
задан timrau 15 August 2012 в 17:06
поделиться

2 ответа

У вас есть несколько возможностей. Один из них - просто использовать булеву математику, чтобы получить биты:

int bit0 = 1;
int bit1 = 2;
int bit2 = 4;
int bit3 = 8;
int bit4 = 16;
int bit5 = 32;
int bit6 = 64;
int bit7 = 128;

if (status & bit1)
    // whatever...

Другой - использовать битовые поля:

struct bits { 
   unsigned bit0 : 1;
   unsigned bit1 : 1;
   unsigned bit2 : 1;
// ...
};

typedef union {
    unsigned char status;
    struct bits bits;
} status_byte;

some_status_byte.status = whatever;
if (status_byte.bits.bit2)
    // whatever...

Первый (по крайней мере, возможно) более переносим, ​​но когда вы имеете дело с битами состояния, есть вероятность, что код в любом случае даже не является немного переносимым, поэтому вы можете не заботиться об этом ...

4
ответ дан 30 November 2019 в 17:51
поделиться

Как уже было сказано, вы не можете адресовать память размером менее байта в C. Я написал бы макрос:

#define BIT(n) (1 << n)

и использовал бы его для доступа к битам. Таким образом, ваш доступ будет одинаковым, независимо от размера структуры, к которой вы обращаетесь. Вы бы написали свой код следующим образом:

if (status & BIT(1)) {
   // Do something if bit 1 is set
} elseif (~status | BIT(2) {
   // Do something else if bit 2 is cleared
} else  {
   // Set bits 1 and 2
   status |= BIT(1) | BIT(2)
   // Clear bits 0 and 4
   status &= ~(BIT(0) | BIT(4))
   // Toggle bit 5 
   status ^= BIT(5)
}

Это позволит вам получить доступ близко к вашей предложенной системе, которая будет использовать [] вместо ().

3
ответ дан 30 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: