0
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;

更新:
これは、実際には上記の例のように短くて美しいコードを書くことです。ユニオンソリューション自体は機能します。lowWordまたはlowByteにアクセスするたびに.wordsまたは.bytesを書き込みたくありません。

4

5 に答える 5

6
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

于 2009-09-27T17:06:06.630 に答える
2

C ++

http://www.cplusplus.com/reference/stl/bitset/はあなたのニーズに応えますか?

プレーンCバージョンは次のようになります。

int32 foo;

//...

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

これは、典型的なCイディオムに従っているため、カスタムクラス/ユニオンを作成するよりも、将来的には保守しやすくなるでしょう。

于 2009-09-27T17:02:26.030 に答える
2

あなたが作ることができます

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++での既知のプロパティエミュレーションです。

于 2009-09-27T17:07:13.863 に答える
0

これをクラスで簡単にラップして、get/setアクセサーを使用できます。

于 2009-09-27T17:01:33.360 に答える
0

これにユニオンを使用するのは悪いことです。なぜなら、それはエンディアン性に対して移植性がないからです。

アクセサ関数を使用し、ビットマスクとシフトを使用してそれらを実装します。

于 2009-09-27T18:07:30.387 に答える