6

だから私は16ビットの数字を持っています。その変数名が Bits であるとします。Bits[2:0]=001、100、000、他は何も変えずに作りたいです。考えられるのは、1になりたいビットを1でORすることだけなので、どうすればよいかわかりませんが、他のビットをクリアして0にする方法がわかりません。アドバイスをいただければ幸いです。ありがとう!

4

2 に答える 2

7

特定のビットをクリアするに&は、クリアするビットの逆を使用します。次に、必要な|ビットを挿入できます。

この場合、下位 3 ビット ( 1112 進数または710 進数) をゼロにする必要があるため、これらのビット&~7クリアする必要があります。

Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001
于 2013-04-10T01:04:49.317 に答える
2

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.value0x80001000000000000000

最後の 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 によって提案されているように、代わりにビット演算を使用することをお勧めします。

于 2013-04-10T01:19:07.843 に答える