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

时间:2012-01-22 23:03:46

标签: bit-manipulation bitwise-operators

我已经搜索了这个,但我的结果并不令人满意,可能是因为说文有多难。我有一个对象state,它是一个byte,表示我的对象在观察时要呈现的部分,以及一个方法disableParts(byte partsToDisable),它将关闭所有位state中已启用的partsToDisable如何在按位操作中实现此功能?(即仅使用ANDORXORNOT,{{1 }},LSHIFTARSHIFTLRSHIFTPLUSMINUS和/或MULTIPLY以及基本程序函数,例如循环和分支语句)

为了清楚起见,这里是我所需功能的直观表示:

DIVIDE

和一个虚拟类(在Java中因为我的想法,但解决方案可以是任何语言或伪代码):

  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)

答案


就像所以没有人像我一样努力...这就是答案:

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
  }
}

和Java中的解决方案:

   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)

2 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:1)

如果您只是反转部分的位,您可以将其与状态

进行对比
 void disableParts(byte parts) {
     byte invertOfParts = 0b11111111 - parts;
     state &= invertOfParts
 }