1

バイトの特定のビットを解析するために使用できるロジックを特定しようとしています。それが設定されているかどうかを確認し、特定のコード行にのみ移動するかどうかを確認します。バイナリ値に対してANDまたはOR演算を実行できるはずですが、ビットの位置が3番目またはMSBとLSB以外の位置である場合、コードでtrueまたはfalseの条件を使用できなくなります。 ANDまたはOR演算を使用して値の比較を行う必要があります。

たとえば、AND演算が00100000の場合、それを00100000と比較して、条件ステートメントを実行する必要があります。

4

2 に答える 2

6

バイトのN番目のビット(通常の8ビットバイトの場合はN = 0..7)をテストする場合は、次を使用できます。

if (byte & (1 << N))
    ...Nth bit is set...

テスト条件は、式が0(false)または非ゼロ(true)であるかどうかをチェックするだけです。あなたはそれを明示的にすることができます:

if ((byte & (1 << N)) != 0)
    ...Nth bit is set...

N番目のビットは次のように設定できます。

byte |= 1 << N;

次のコマンドでN番目のビットをリセット(ゼロ)できます。

byte &= ~(1 << N);

次のコマンドでN番目のビットを反転または切り替えることができます。

byte ^= (1 << N);

私はずっとこの名前を使用しましたがbyte、シフトが正しい範囲内にある限り、任意の整数型の任意のビットでこれを行うことができます。

于 2013-01-07T15:51:46.853 に答える
1

それはこのように動作します:

最初に注意するのは、Cテストでは値0が偽であり、他の値はすべて真と見なされることです。

次に、特定のビットが設定されているかどうかをテストするには、次のようなテストを使用します(数年前に作成したマクロのセットの1つ)

#define IS_SET(number, position) (number & (1 << position))

次に、次のように使用できます。

if(IS_SET(15,2)){ }。ただし、ビットカウントは右端のビットから始まり、右端のビットから数えて左に向かって移動することに注意してください0

以下は、マクロが実際にどのように機能するかです(これは、8ビット、16ビット、32ビットなどのすべての整数タイプで機能することに注意してください)ビット単位の数値150x0F = 0000 0000 0000 0000 0000 00000 1111 1111、32ビットマシン上にあります。

左シフト12回、yeilds0000 0000 0000 0000 0000 0000 0000 0100

2つの数値をANDすることで次のようになります。

0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 0000 0000 0000 0100 &
------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0100 (which is not 0, hence true)
------------------------------------------

このようにして、設定またはクリアするビットシーケンスの任意の位置をテストできます。

于 2013-01-07T15:56:30.643 に答える