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)