だから私は16ビットの数字を持っています。その変数名が Bits であるとします。Bits[2:0]=001、100、000、他は何も変えずに作りたいです。考えられるのは、1になりたいビットを1でORすることだけなので、どうすればよいかわかりませんが、他のビットをクリアして0にする方法がわかりません。アドバイスをいただければ幸いです。ありがとう!
2 に答える
特定のビットをクリアするに&
は、クリアするビットの逆を使用します。次に、必要な|
ビットを挿入できます。
この場合、下位 3 ビット ( 111
2 進数または7
10 進数) をゼロにする必要があるため、これらのビット&
を~7
クリアする必要があります。
Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001
union
構造体を使用すると、変数のビット数を指定し、より大きな変数の各ビットを個別にアドレス指定できます。
union {
short value;
struct {
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
unsigned char bit8 : 1;
unsigned char bit9 : 1;
unsigned char bit10 : 1;
unsigned char bit11 : 1;
unsigned char bit12 : 1;
unsigned char bit13 : 1;
unsigned char bit14 : 1;
unsigned char bit15 : 1;
} bits;
} var;
var
これで、で参照できる 16 ビット整数を保持するという名前の変数ができました。var.value
からアクセスすることで、この変数の個々のビットにアクセスできvar.bits.bit0
ますvar.bits.bit15
。
設定するvar.value = 0;
と、すべてのビットも 0 に設定されます。を設定すると、 の値がに、またはバイナリで表示されるようにvar.bits.bit0 = 1;
に自動的に変更されます。var.value
0x8000
1000000000000000
最後の 3 ビットのみを変更する場合は、構造を次のように単純化できます。
union {
short value;
struct {
unsigned short header : 13;
unsigned char bit13 : 1;
unsigned char bit14 : 1;
unsigned char bit15 : 1;
} bits;
} var;
これvar.bits.header
で、13 ビット変数である と、他の 3 つの 1 ビット変数で遊ぶことができます。
ただし、C++ はこの種の構造をサポートしていないことに注意してください。そのため、C から C++ への移植性を最大限に高めるには、@nneonneo によって提案されているように、代わりにビット演算を使用することをお勧めします。