我已经搜索了这个,但我的结果并不令人满意,可能是因为说文有多难。我有一个对象state
,它是一个byte
,表示我的对象在观察时要呈现的部分,以及一个方法disableParts(byte partsToDisable)
,它将关闭所有位state
中已启用的partsToDisable
。 如何在按位操作中实现此功能?(即仅使用AND
,OR
,XOR
,NOT
,{{1 }},LSHIFT
,ARSHIFT
,LRSHIFT
,PLUS
,MINUS
和/或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)
答案 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
}