2010-04-26 2 views
1

HI все,Бит-поля в C?

Есть в любом случае, с помощью которого мы можем объявить переменную задающий битовые поля на тех, которые не являются членами каких-либо структур или unions.If нет, то есть в любом случае, с помощью которого мы можем просто объявить переменную, указав количество бит, которое разрешено использовать.

Благодаря Мэдди

+0

@SysAdmin .... Да, конечно – maddy

ответ

4

А очень простая и старая техника является просто определить количество #define переменных, значения которых соответствуют расположению битов, а затем использовать AND и OR операции для удаления или установки при необходимости. , например.

#define BIT_0 0x0001 
#define BIT_1 0x0002 
#define BIT_2 0x0004 
#define BIT_3 0x0008 
#define BIT_4 0x0010 

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

int someVariable = 0; 

someVariable = someVariable | BIT_1; //set bit 1 to 1. someVariable = 2 

someVariable = someVariable & ~BIT_1; // clear bit 1. someVariable = 0 

Неэффективный или умный, но легко читаемый.

редактировать - добавил Если вы хотите ограничить, какие биты действительны для использования, то установка значения масок применяются следующим образом:

#define VALID_BIT_MASK 0x0009 // thus only bits 3 and 0 are valid 

В качестве примера

someVariable = someVariable | BIT_0 | BIT_2 | BIT_4; // someVariable now has value 21 

someVariable = someVariable & VALID_BIT_MASK; // remove invalid bits, someVariable value is now 1 

Очевидно someVariable будет байтом, unsigned int или unsigned long, но скажите, что вы хотите только 11 бит набора unsigned int (16 бит).

#define VALID_BIT_MASK 0x07FF; // 011111111111 in binary. 

someVariable = someVariable & VALID_BIT_MASK; //strips off unwanted bits. 
+0

@ChrisBD ---- Это было хорошее предложение, но так или иначе, мы можем сохранить ограничение на размер переменной, которая не является ни членом структуры, ни объединением? – maddy

+0

@maddy - Я отредактировал свой ответ. Это помогает? – ChrisBD

+0

Чрезвычайно много сэр. Это было очень полезно. – maddy

0

Нет - если только он не будет такого же размера, как встроенного типа (например, 8, 16, 32 или 64 бит), то вам нужно будет вставлять его в структуры.

0

Нет, вы должны использовать технику, показанную here

+1

@ штабелер-это один был недостаточно ясен. Все лучшее объяснение, если возможно, пожалуйста? – maddy

0

Нет никакой выгоды при объявлении переменной с битами, отличными от встроенного. потому что компилятор в конечном итоге зарезервирует для него 8,16,32 или 64 бит. Например, если вы объявите переменную unsigned x: 5; то компилятор создаст 8 бит пространства для его хранения. потому что CPU не может считывать память, которая не является кратной 8

0

В контексте ARM использование побитовых операций с полем является обычным явлением при настройке аппаратных компонентов SOC с использованием C. LPC_SC-> FLASHCFG = (LPC_SC-> FLASHCFG & ~ 0x0000F000) | FLASHCFG_Val; обновляет 4-битное поле в регистре конфигурации со значением FLASHCFG_Val. Или, в то время как ((LPC_SC-> PLL1STAT & (1 < < 10))!); // Ожидание PLOCK1 для проверки одного бита в регистре состояния, где 1 < < 10 указывает на 10-битовую позицию.

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