高速ではなくコンパクト(コメントに示されている)が必要な場合は、次のようなことをしてみませんか。
#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
は何も追加しません。0x04
UART_READ_READY_BITのようなものであれば、それで問題ありませんが、持っているものは次よりもわずかに優れています。
#define THREE 3
(攻撃は意図されていません、私は自分の意見を指摘しているだけです)。私はビットパターンを計算し、それらをコードにまっすぐに入れます(あなたの場合はビット1から6は0x3fです)。
そして、余談ですが、あなたの特定のケースでは、とにかくそれらの6ビットだけになると思うbits
ので、0と比較するだけで十分であることがわかります(ビットマスキングなし)。特定のビットをチェックするためのモードの一般的なソリューションが必要な場合に備えて、ビットマスキング方法を残しました。