Упаковка int в битовое поле в C ++ - PullRequest
2 голосов
/ 30 июля 2011

Я конвертирую некоторый код из ASM в C ++, ASM просто выглядит так:

mov dword ptr miscStruct, eax

Структура выглядит так:

struct miscStruct_s {
  uLong brandID     : 8,
  chunks            : 8,
  //etc
} miscStruct;

Есть ли простойдвухстрочный способ заполнить структуру в C ++?До сих пор я использую:

miscStruct.brandID = Info[0] & 0xff; //Info[0] has the same data as eax in the ASM sample.
miscStruct.chunks = ((Info[0] >> 8) & 0xff);

Это прекрасно работает и все, но я должен заполнить около 9-10 из этих структур битовых полей, некоторые из них имеют 30 нечетных полей.Таким образом, выполнение этого способа в конечном итоге превращает 10 строк кода в 100+, что, очевидно, не так уж и здорово.

Так есть ли простой, чистый способ репликации ASM в C ++?

Iконечно пробовал "miscStruct = CPUInfo [0];"но C ++ это не нравится, к сожалению.: (

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int'

.. И я не могу редактировать структуру .

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Дословный перевод инструкции ассемблера таков:

miscStruct=*(miscStruct_s *)&Info[0];

Приведения необходимы, потому что C ++ является языком, безопасным для типов, а ассемблер - нет, но семантика копирования идентична.

1 голос
/ 30 июля 2011

memcpy (&miscStruct, &CPUInfo[0], sizeof (struct miscStruct_s));

должно помочь.

или просто

int *temp = &miscStruct;
*temp = CPUInfo[0];

Здесь я предположил, что тип CPUInfo равен int.Вам необходимо настроить тип указателя temp с помощью типа данных массива CPUInfo.Просто введите адрес памяти для структуры в тип массива и присвойте ему значение с помощью указателя.

...