Java 如何使用位运算符来实现这一点?
Java 如何使用位运算符来实现这一点?,java,bit-manipulation,Java,Bit Manipulation,d的预期值为0b1010011110 我需要写入d,这样当c的位为1时,结果中的对应位为b中的对应位,但当c的位为0时,结果中的对应位为a中的对应位 我在这个问题上纠结了一段时间,似乎一句话也说不出什么来。我觉得这是家庭作业,但我还是会回答的,因为如果不给出答案,很难解释这个问题 考虑两个更简单的问题。忘记多个位,假设a、b、c和d只有一个位(因为这是按位操作,逻辑不会改变): 当c为1时,d=b。当c为0时,d=0。 当c和b都为1时,d最终为1。如果b或c为0,则d为0。 这意味着d=b&c
d
的预期值为0b1010011110
我需要写入d
,这样当c
的位为1时,结果中的对应位为b
中的对应位,但当c
的位为0时,结果中的对应位为a
中的对应位
我在这个问题上纠结了一段时间,似乎一句话也说不出什么来。我觉得这是家庭作业,但我还是会回答的,因为如果不给出答案,很难解释这个问题 考虑两个更简单的问题。忘记多个位,假设a、b、c和d只有一个位(因为这是按位操作,逻辑不会改变):
当c和b都为1时,d最终为1。如果b或c为0,则d为0。
这意味着d=b&c
这与案例1非常相似,只是c被翻转,a被b替换。
因此,我们可以将b替换为a,将c替换为~c以获得此解决方案。
这意味着d=a&~c
d=(b&c)|(a&c)。我之前有过这个,但没有看到您的编辑
int a = 0b1011011011;
int b = 0b1000110110;
int c = 0b0101010101;
int d = (a & b) ^ c; //Wrong
- q=c&b在c为1时产生b,与b无关
- p=~c&a在c为0时产生a,与a无关
- q^p只保留a或b专有的位,否则保留0
int d = (c & b)^(~c & a) ;
但是这个测试数据同样是一个好的测试,而且更容易阅读。我所做的就是重新排列位列,这样c就不会经常更改:
int a = 0b1011011011;
int b = 0b1000110110;
int c = 0b0101010101;
int d = 0b1010011110;
由于Java7,我们还可以使它们看起来更容易一些
现在应该很容易看出,c控制d从a或b复制的位置。易于阅读的数据也很重要
现在,一些小面具
int a = 0b11011_01101;
int b = 0b10101_00110;
int c = 0b00000_11111;
int d = 0b11011_00110;
或者把它们放在一起,你会得到:
assertTrue(b & c ==0b00000_00110);
assertTrue(a & ^c==0b11011_00000);
用这两个数据集中的任何一个进行尝试。应该还能用
您也可以将它们
xor
放在一起。这无关紧要,因为c掩码的否定已经排除了两边1的可能性。我选择了或仅仅是出于传统意义。d的预期值有9位,而a、b和c有10位。这是打字错误,还是有一个隐式的前导0位?(a&~c)^(b&c)
?不完全正确,但这是一个起点。修正了,输入错误应该是10位
int d = 0b11011_00110;
assertTrue(d == (b & c) | (a & ^c));