Преобразование бит-поля в int

У меня бит-бит объявлен таким образом:

typedef struct morder { unsigned int targetRegister : 3; unsigned int targetMethodOfAddressing : 3; unsigned int originRegister : 3; unsigned int originMethodOfAddressing : 3; unsigned int oCode : 4; } bitset; 

У меня также есть int array, и я хочу получить значение int из этого массива, который представляет фактическое значение этого битового поля (которое на самом деле является своего рода машинным словом, в котором у меня есть его части, и я хочу, чтобы int-представление все слово).

Большое спасибо.

Вы можете использовать объединение:

 typedef union bitsetConvertor { bitset bs; uint16_t i; } bitsetConvertor; bitsetConvertor convertor; convertor.i = myInt; bitset bs = convertor.bs; 

Или вы можете использовать актерский состав:

 bitset bs = *(bitset *)&myInt; 

Или вы можете использовать анонимную структуру в союзе:

 typedef union morder { struct { unsigned int targetRegister : 3; unsigned int targetMethodOfAddressing : 3; unsigned int originRegister : 3; unsigned int originMethodOfAddressing : 3; unsigned int oCode : 4; }; uint16_t intRepresentation; } bitset; bitset bs; bs.intRepresentation = myInt; 

Пожалуйста, не пользуйтесь союзом. Или, скорее, понять, что вы делаете, используя союз – желательно, прежде чем использовать его.

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

Теперь, если ваш вопрос был, как вы можете распечатать структуру битового поля как int, для случайного частного просмотра, конечно, союзы велики. Но вам, похоже, нужна «фактическая ценность» ваших битполей.

Итак: если вы работаете только с этой комбинацией машин / компиляторов, и вам не нужно полагаться на математическое значение int, если это имеет смысл, вы можете использовать союзы. Но если вы можете перенести свой код или вам понадобится «фактическое значение» для int, вам нужно написать код манипуляции бит, чтобы получить битовые поля в правильные биты int.

Конечно – просто используйте союз. Затем вы можете получить доступ к своим данным либо как 16 бит int, либо как отдельные битовые поля, например

 #include  #include  typedef struct { unsigned int targetRegister : 3; unsigned int targetMethodOfAddressing : 3; unsigned int originRegister : 3; unsigned int originMethodOfAddressing : 3; unsigned int oCode : 4; } bitset; typedef union { bitset b; uint16_t i; } u_bitset; int main(void) { u_bitset u = {{0}}; uboriginRegister = 1; printf("ui = %#x\n", ui); return 0; }