1

こんにちは、みんな、

構造体または共用体のメンバーではないビットフィールドを指定して変数を宣言できる方法はありますか? .

ありがとうマディ

4

5 に答える 5

4

非常に単純で古い手法は、値がビット位置に対応する多数の #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.
于 2010-04-26T10:29:49.400 に答える
0

いいえ - たまたま組み込み型と同じサイズ (8、16、32、64 ビットなど) でない限り、構造体に埋め込む必要があります。

于 2010-04-26T09:06:05.367 に答える
0

いいえ、ここに示すテクニックを使用する必要があります

于 2010-04-26T09:06:07.923 に答える
0

ARM コンテキストでは、C を使用して SOC のハードウェア コンポーネントを構成するときに、ビットごとのフィールド演算を使用するのが一般的です。FLASHCFG_Val; 構成レジスタの 4 ビット フィールドを FLASHCFG_Val の値で更新します。または、while (!(LPC_SC->PLL1STAT & (1<<10)));// PLOCK1 がステータス レジスタの単一ビットをテストするのを待ちます。ここで、1<<10 は 10 番目のビット位置を示します。

于 2016-05-16T17:38:27.403 に答える
0

組み込み型以外のビットで変数を宣言する利点はありません。コンパイラは最終的に8、16、32、または64ビットのスペースを予約するためです。たとえば、変数の符号なしx:5を宣言した場合。次に、コンパイラはそれを格納するために 8 ビットのスペースを作成します。CPUは8の倍数ではないメモリを読み取ることができないため

于 2013-05-02T10:03:30.877 に答える