2

これよりも私のビットを比較するよりコンパクトな方法はありますか(私が知っている唯一の方法):

#define BIT1 1
#define BIT2 2
#define BIT3 4
#define BIT4 8
#define BIT5 16
#define BIT6 32

// I declare this somewhere in a structure
unsigned char bits: 6;

// I want all of them to be 0 at first (000000)
bits = 0;

/* I do some bite setting here */

// I only want to know if the state of my bits == 000000
if(bits & (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6) == (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6))
{
    // All kinds of nasty stuff
}

多分私はの行に何かを考えましたbits & 0x00 == 0x00

4

4 に答える 4

2

高速ではなくコンパクト(コメントに示されている)が必要な場合は、次のようなことをしてみませんか。

#define BIT1 0x01
#define BIT2 0x02
#define BIT3 0x04
#define BIT4 0x08
#define BIT5 0x10
#define BIT6 0x20
#define BITS1THRU4 (BIT1|BIT2|BIT3|BIT4)
// or #define BITS1THRU6 0x0f

// I declare this somewhere in a structure
unsigned char bits: 6;

// I want all of them to be 0 at first (000000)
bits = 0;

/* I do some bit setting here */

// I only want to know if the state of my first four bits == 0000
if(bits & BITS1THRU4 == 0) ...

元のコードはとにかくその定数に変換されているので、おそらくこれ以上速くはなりませんが、より読みやすくなる可能性があります(これは多くの場合それを行うのに十分な理由です)。

他のバリエーションが必要な場合は、それらを定義するだけです。それらの数が多すぎる場合(63の定義、すべてを使用する場合は、少し高くなる可能性があります)、別の解決策について考え始めます。

しかし、正直なところ、定義にもっと意味のある名前を使用しない限り、私はそれらを捨てるだけです。この名前は、ビットパターンを理解している人にBIT3は何も追加しません。0x04UART_READ_READY_BITのようなものであれば、それで問題ありませんが、持っているものは次よりもわずかに優れています。

#define THREE 3

(攻撃は意図されていません、私は自分の意見を指摘しているだけです)。私はビットパターンを計算し、それらをコードにまっすぐに入れます(あなたの場合はビット1から6は0x3fです)。

そして、余談ですが、あなたの特定のケースでは、とにかくそれらの6ビットだけになると思うbitsので、0と比較するだけで十分であることがわかります(ビットマスキングなし)。特定のビットをチェックするためのモードの一般的なソリューションが必要な場合に備えて、ビットマスキング方法を残しました。

于 2010-12-23T00:54:13.407 に答える
1

私があなたの条件を正しく読んだ場合(@ user547710のように括弧を修正して)、すべてのビットがゼロではなく設定されているかどうかを確認します。

とにかく、ビット1〜6をでよりコンパクトに設定したマスクを定義できます(1u << 6) - 1。これはコンパイル時の定数式であるため、余分な計算時間を心配する必要はありません。私はします:

const unsigned char bitmask6 = 1u << 6) - 1;

if ((bits & bitmask6) == bitmask6)
于 2010-12-23T15:50:09.603 に答える
1
if( ~bits & (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6) == (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6))

そして、速度について(BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6)は実際には定数としてコンパイルされ、1つのNORと1つの比較(x386がNORをサポートするかどうかはわかりませんが、しかし、私はそう思います)

于 2010-12-23T00:34:01.210 に答える
0

これは単なるメモですが、演算子==は論理よりも優先順位が高く&、次のように括弧で囲む必要があります。

if((a & b) == c)

これが質問者の意図だと解釈しました。

(コメントとして投稿するべきだと思いますが、コメントが投稿できないようです)

于 2010-12-23T12:37:46.017 に答える