如何在仅使用按位运算符的情况下关闭某些位而忽略其他位

Sup*_*tar 17 bit-manipulation bitwise-operators

我已经搜索了这个,但我的结果并不令人满意,可能是因为说文有多难.我有一个对象,state,这是一个byte表示哪个我的对象的部分是观察到当将被渲染,和一种方法,disableParts(byte partsToDisable),这将关闭在所有的位state为ON中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)
Run Code Online (Sandbox Code Playgroud)

和一个虚拟类(在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
  }
}
Run Code Online (Sandbox Code Playgroud)

回答


就这样,没有人像我那样努力...这就是答案:

   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)
Run Code Online (Sandbox Code Playgroud)

和Java中的解决方案:

public void disableParts(byte partsToDisable)
{
  state &= ~partsToDisable;
}
Run Code Online (Sandbox Code Playgroud)

And*_*per 30

您需要做的是将位反转(逐位NOT),partsToDisable以便最终得到一个掩码,其中1是要保留的位,0是要关闭的位.然后用这个掩码和状态值.

public void disableParts( byte partsToDisable)
{
    state = state & (~partsToDisable);
}
Run Code Online (Sandbox Code Playgroud)