残りに影響を与えることなく、Cのバイトの特定のビットのみをどのように設定しますか?

StackOverflow https://stackoverflow.com/questions/4439078

  •  09-10-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

4ビットが0に設定され、他のすべてのセットが1に設定されて、ビットワイズですべてのビットを0に設定できます(これは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.

他のヒント

一般に:

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

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

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

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

多分より良い方法があるかもしれません、私は知りません。これは今のところあなたに役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top