web-dev-qa-db-ja.com

残りに影響を与えずにCでバイトの特定のビットのみをどのように設定しますか?

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

20
PICyourBrain

これらのすべてのビットを0に設定するには、4ビットを0に設定し、その他すべてを1に設定します(これは、4ビットを1に設定した場合の補数です)。次に、ビット単位で、または通常どおりにビット単位で行うことができます。

すなわち

 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.
14
Goz

一般に:

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

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

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

44
thkala

ビット演算子または|を使用しますバイトのビットを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);
}

多分もっと良い方法があるでしょう、私にはわかりません。これは今のところあなたを助けます。

0
Yedin