22

この 1010XXXX のようなバイトがあり、X の値は何でもかまいません。下位 4 ビットを特定のパターン、たとえば 1100 に設定し、上位 4 ビットは影響を受けないようにしたいと考えています。Cでこれを最速で行うにはどうすればよいですか?

4

4 に答える 4

55

一般に:

value = (value & ~mask) | (newvalue & mask);

mask変更するすべてのビット (およびそれらのみ) を 1 に設定した値です。この場合は 0xf になります。newvalueこれらのビットの新しい状態を含む値です。他のすべてのビットは基本的に無視されます。

これは、ビット単位の演算子がサポートされているすべての型で機能します。

于 2010-12-14T12:36:57.520 に答える
17

これらのすべてのビットを 0 に設定するには、4 ビットを 0 に設定し、他のすべてを 1 に設定してビットごとの論理積をとります (これは、1 に設定された 4 ビットの補数です)。その後、通常どおりビットごとにまたはビット単位で論理和を実行できます。

すなわち

 val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
 val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
                          // other bits are set.
于 2010-12-14T12:23:55.337 に答える
1

ビット演算子または | を使用します。バイトのビットを 0 から 1 に変更したい場合。

バイトのビットを 1 から 0 に変更する場合は、ビット演算子と & を使用します。

#include <stdio.h>

int byte;
int chb;

int main() {
// Change bit 2 of byte from 0 to 1
byte = 0b10101010;    
chb = 0b00000100;       //0 to 1 changer byte
printf("%d\n",byte);    // display current status of byte

byte = byte | chb;      // perform 0 to 1 single bit changing operation
printf("%d\n",byte);

// Change bit 2 of byte back from 1 to 0
chb = 0b11111011;       //1 to 0 changer byte

byte = byte & chb;      // perform 1 to 0 single bit changing operation
printf("%d\n",byte);
}

もっと良い方法があるかもしれませんが、私にはわかりません。これは今のところ役に立ちます。

于 2017-07-26T15:35:53.440 に答える