Класс C++ для доступа к байтам / словам целого без знака

union LowLevelNumber
{
 unsigned int n;
 struct
 {
  unsigned int lowByte : 8;
  unsigned int highByte : 8;
  unsigned int upperLowByte : 8;
  unsigned int upperHighByte : 8;
 } bytes;
 struct
 {
  unsigned int lowWord : 16;
  unsigned int highWord : 16;
 } words;     
};

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

var.words.lowWord = 0x66;

Есть ли способ, который позволил бы мне написать код, подобный этому:

var.lowWord = 0x66;

Обновить:
Это действительно о написании короткого / красивого кода, как в примере выше. Само решение для объединения действительно работает, я просто не хочу писать.words или.bytes каждый раз, когда получаю доступ к lowWord или lowByte.

5 ответов

Решение
union LowLevelNumber {
    unsigned int n;
    struct {
        unsigned int lowByte : 8;
        unsigned int highByte : 8;
        unsigned int upperLowByte : 8;
        unsigned int upperHighByte : 8;
    };
    struct {
        unsigned int lowWord : 16;
        unsigned int highWord : 16;
    };
};

Обратите внимание на удаленный bytes а также words имена.

C++

Будет ли http://www.cplusplus.com/reference/stl/bitset/ служить вашим потребностям?

Обычная версия C будет выглядеть примерно так:

int32 foo;

//...

//Set to 0x66 at the low byte
foo &= 0xffffff00;
foo |= 0x66;

Это, вероятно, будет более удобным в будущем, чем написание собственного класса / объединения, потому что оно следует типичной C-фразеологии.

Ты можешь сделать

short& loword() { return (short&)(*(void*)&m_source); }

и используйте его, если вам все равно, скобки.

Или вы можете пойти в фантазии

public class lowordaccess
{
   unsigned int m_source;
public:
   void assign(unsigned int& source) { m_source = source; }
   short& operator=(short& value) { ... set m_source }
   operator short() { return m_source & 0xFF; }
}

а потом

struct LowLevelNumber
{
   LowLevelNumber() { loword.assign(number); }

   unsigned int number;
   lowordaccess loword;
}
var.loword = 1;
short n = var.loword;

Последний метод - это эмуляция известных свойств в C++.

Вы можете легко обернуть это в классе и использовать методы доступа get/set.

Использование объединения для этого плохо, потому что оно не переносимо по порядку байтов.

Используйте функции доступа и реализуйте их с помощью битовых масок и сдвигов.

Другие вопросы по тегам