web-dev-qa-db-ja.com

ビット演算子のみを使用して他のビットを無視しながら一部のビットをオフにする方法

私はこれを検索しましたが、おそらくWordの難しさのために、私の結果は満足のいくものではありませんでした。 1つのオブジェクトstateがあります。これは観察時にオブジェクトのどの部分がレンダリングされるかを表すbyteであり、メソッドdisableParts(byte partsToDisable)は次のようになります。 stateでオンになっているpartsToDisableのすべてのビットをオフにします。 ビット演算でこの機能を実現するにはどうすればよいですか?(つまり、ANDORXORNOTのみを使用します、LSHIFTARSHIFTLRSHIFTPLUSMINUSMULTIPLY、またはDIVIDEおよびループや分岐ステートメントなどの基本的なプログラム関数)

少し明確にするために、これが私の希望する機能の視覚的表現です:

  0010 0101 (current state, 37 in this example)
? 1010 0010 (bits to disable, -94 in this example)
============
  0000 0101 (new state, 5 in this example)

およびダミークラス(Javaであるため、私はそう考えていますが、解決策は任意の言語または擬似コードにすることができます):

class BitThoughts
{
  byte state;

  public void doIt()
  {
    state = 0b00100101;
    System.out.println("Initial state: " + state);

    disableParts(0b10100010);

    if (state == 0b00000101)
      System.out.println("Success! New state is " + state);
    else
      System.out.println("Failure! New state is " + state);
  }

  public void disableParts(byte partsToDisable)
  {
    //Do magic to state
  }
}

回答


私ほど激しくダープする人はいないので...答えは次のとおりです。

   0010 0101 (current state, 37 in this example)
& ~1010 0010 (bits to disable, -94 in this example)
=============

becomes:

   0010 0101 (current state: 37)
&  0101 1101 (inverted bits to disable: 93)
=============
   0000 0101 (new state, 5 in this example)

およびJavaのソリューション:

public void disableParts(byte partsToDisable)
{
  state &= ~partsToDisable;
}
18
Supuhstar

partsToDisableのビット(ビット単位ではない)を反転する必要があるため、1がそのままにしておくビットで、0がオフにするビットであるマスクになります。次に、このマスクと状態値のANDを取ります。

public void disableParts( byte partsToDisable)
{
    state = state & (~partsToDisable);
}
30
Andrew Cooper

パーツのビットを反転するだけで、状態とANDすることができます

 void disableParts(byte parts) {
     byte invertOfParts = 0b11111111 - parts;
     state &= invertOfParts
 }
1
Amir Pashazadeh