こんにちは、みんな、
構造体または共用体のメンバーではないビットフィールドを指定して変数を宣言できる方法はありますか? .
ありがとうマディ
非常に単純で古い手法は、値がビット位置に対応する多数の #define 変数を定義し、AND および OR 操作を使用してそれらを適切にクリアまたは設定することです。例えば
#define BIT_0 0x0001
#define BIT_1 0x0002
#define BIT_2 0x0004
#define BIT_3 0x0008
#define BIT_4 0x0010
次に、それらを使用して、標準変数のビット位置を設定します。
int someVariable = 0;
someVariable = someVariable | BIT_1; //set bit 1 to 1. someVariable = 2
someVariable = someVariable & ~BIT_1; // clear bit 1. someVariable = 0
効率的でも巧妙でもありませんが、読みやすいです。
編集 - 追加 有効なビットの使用を制限したい場合は、次のようにマスク値を設定して適用します。
#define VALID_BIT_MASK 0x0009 // thus only bits 3 and 0 are valid
例として
someVariable = someVariable | BIT_0 | BIT_2 | BIT_4; // someVariable now has value 21
someVariable = someVariable & VALID_BIT_MASK; // remove invalid bits, someVariable value is now 1
明らかに、someVariable は byte、unsigned int、または unsigned long になりますが、unsigned int (16 ビット) の 11 ビット セットのみが必要だとします。
#define VALID_BIT_MASK 0x07FF; // 011111111111 in binary.
someVariable = someVariable & VALID_BIT_MASK; //strips off unwanted bits.
いいえ - たまたま組み込み型と同じサイズ (8、16、32、64 ビットなど) でない限り、構造体に埋め込む必要があります。
いいえ、ここに示すテクニックを使用する必要があります
ARM コンテキストでは、C を使用して SOC のハードウェア コンポーネントを構成するときに、ビットごとのフィールド演算を使用するのが一般的です。FLASHCFG_Val; 構成レジスタの 4 ビット フィールドを FLASHCFG_Val の値で更新します。または、while (!(LPC_SC->PLL1STAT & (1<<10)));// PLOCK1 がステータス レジスタの単一ビットをテストするのを待ちます。ここで、1<<10 は 10 番目のビット位置を示します。
組み込み型以外のビットで変数を宣言する利点はありません。コンパイラは最終的に8、16、32、または64ビットのスペースを予約するためです。たとえば、変数の符号なしx:5を宣言した場合。次に、コンパイラはそれを格納するために 8 ビットのスペースを作成します。CPUは8の倍数ではないメモリを読み取ることができないため