私はこれを検索しましたが、おそらくWordの難しさのために、私の結果は満足のいくものではありませんでした。 1つのオブジェクトstate
があります。これは観察時にオブジェクトのどの部分がレンダリングされるかを表すbyte
であり、メソッドdisableParts(byte partsToDisable)
は次のようになります。 state
でオンになっているpartsToDisable
のすべてのビットをオフにします。 ビット演算でこの機能を実現するにはどうすればよいですか?(つまり、AND
、OR
、XOR
、NOT
のみを使用します、LSHIFT
、ARSHIFT
、LRSHIFT
、PLUS
、MINUS
、MULTIPLY
、または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;
}
partsToDisable
のビット(ビット単位ではない)を反転する必要があるため、1がそのままにしておくビットで、0がオフにするビットであるマスクになります。次に、このマスクと状態値のANDを取ります。
public void disableParts( byte partsToDisable)
{
state = state & (~partsToDisable);
}
パーツのビットを反転するだけで、状態とANDすることができます
void disableParts(byte parts) {
byte invertOfParts = 0b11111111 - parts;
state &= invertOfParts
}