1

最初の 6 ビットで 6 つのオン/オフ フラグを使用し、最後の 2 ビットを使用して 4 つの異なる値を保持します。これは非常に基本的なことで、このようなマクロがどこかに存在するはずですが、見つかりません。

 #define HOT 0x00
 #define BIG 0x01
 #define FAT 0x02
 #define HIT 0x03
 #define BAT 0x04
 #define ZAX 0x05    
 #define HOW 0x06

 #define TWO_BITS     nnn    // ???
 #define CONDITION_0  nnn   // bit combo: 00
 #define CONDITION_1  nnn   // bit combo: 01
 #define CONDITION_2  nnn   // bit combo: 10
 #define CONDITION_3  nnn   // bit combo: 11

void bitter(void)
{
    unsigned char myBits = 0;
    bool nonsense;

    if (myBits & BIG)  nonsense = true;    // BIG flag on   
    if (!(myBits & BAT)) nonsense = false; // BAT flag off

    myBits = myBits | BIG;     // turn on BIG bit
    myBits = myBits & ~BIG;    // turn off BIG bit

    if (TWO_BITS == CONDITION_0)
        doThis();
    else if (TWO_BITS == CONDITION_1_)
        doThat();
    // ... etc

}

では、これらの最後の 2 ビットでやりたいことをコーディングする最良の方法は何ですか? コードの書き方がわからないため、パフォーマンス テストを行うことはできませんでしたが、これがこの種の操作を実行する最速の方法であると想定しています。

[ところで、これは宿題のようなにおいがするかもしれませんが、私は新しいトリックを学ぼうとしている 54 歳の犬です。]

4

3 に答える 3

1

最後の2ビット(0x03)にビットマスクを適用し、結果をオンにする必要があります。

switch (myBits & 0x03) {
    case 0: // CONDITION_0
        doThis();
        break;
    case 1: // CONDITION_1
        doThat();
        break;
    case 2: // CONDITION_2
    case 3: // CONDITION_3
}

また、それらを再利用するためのマクロとして使用する場合は、次のようにします。

#define CONDITION_0(X) (((X) & 0x03) == 0)
#define CONDITION_1(X) (((X) & 0x03) == 1)
#define CONDITION_2(X) (((X) & 0x03) == 2)
#define CONDITION_3(X) (((X) & 0x03) == 3)

次に、次のように書く必要があります。

if (CONDITION_0(myBits)) {
    doThis();
} else if (CONDITION_1(myBits)) {
    doThat();
}
于 2012-05-11T19:42:34.103 に答える
1

これらの 2 ビットを 0 から 3 の間の (10 進数) 値として単独で処理する必要があるか、または常にバイトの上位 2 ビットとして処理する必要があるかによって異なります。

ここに 1 つの方法があります。他のすべてのビットをマスクして、これらの 2 ビットがバイトの上位 2 ビットとして作成される値として条件を定義します。

 #define TWO_BITS(x) ((x) & 0xC0)

 #define CONDITION_0  0
 #define CONDITION_1  0x40   // bit combo: 01
 #define CONDITION_2  0x80   // bit combo: 10
 #define CONDITION_3  0xC0   // bit combo: 11

つまり、バイトの上位 2 ビットはバイナリ 1 1 0 0 0 0 0 であり、16 進数では 0xC0 です。そして、上位 2 ビットは 0 1 です。つまり、1 バイト内のすべてのビットで、0 1 0 0 0 0 0 0 になります。これは、16 進数で 0x40 です。

そして、あなたのテストは

if (TWO_BITS(myBits) == CONDITION_0)

もう 1 つの方法は、上位 2 ビットを 2 ビット整数 (つまり、0 から 3 の間の値) として抽出することです。それは簡単です。ビットを 6 桁右にシフトするだけです。

 #define TWO_BITS(x) ((x) >> 6)

 #define CONDITION_0  0x0
 #define CONDITION_1  0x01   // bit combo: 01
 #define CONDITION_2  0x02   // bit combo: 10
 #define CONDITION_3  0x03   // bit combo: 11

条件の 1 つをテストするときの使用法は同じです。

 if (TWO_BITS(myBits) == CONDITION_0)

最後に、下位 6 ビットのフラグが少し間違っているようです。

#define HOW 0x06

0x06 はバイナリ値 0 0 0 0 0 1 1 0 であるため、実際には 2 ビットをオンまたはテストしています。1 つのビットを 1 つのフラグに関連付ける必要がある可能性があります。これは次のシーケンスになります。

 #define BIG 0x01
 #define FAT 0x02
 #define HIT 0x04
 #define BAT 0x08
 #define ZAX 0x10
 #define HOW 0x20

これはビット シフトとして記述されることが多いため、どのビットであるかを簡単に読み取ることができます。

 #define BIG (1 << 0)  //bit zero
 #define FAT (1 << 1)  //bit 1
 #define HIT (1 << 2)  //bit 2
 #define BAT (1 << 3)  //bit 3 , etc.
 #define ZAX (1 << 4)
 #define HOW (1 << 5)
于 2012-05-11T19:49:36.370 に答える
1

あなたが何を望んでいるのかよくわかりませんが、2ビットが設定されているかどうかを確認したいようです。その場合、たとえば、最後の 2 ビットが両方とも設定されているかどうかを確認したい場合は、次のようにします。

((myBits & 3) == 3)
于 2012-05-11T19:37:45.647 に答える