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为1时,d=b。当c为0时,d=0。
    当c和b都为1时,d最终为1。如果b或c为0,则d为0。
    这意味着d=b&c
  • 当c为0时,d=a。当c为1时,d=0。
    这与案例1非常相似,只是c被翻转,a被b替换。
    因此,我们可以将b替换为a,将c替换为~c以获得此解决方案。
    这意味着d=a&~c
  • 现在来回答你的原始问题:如果我们拿这两个简单的例子,我们可以看到它们不可能都是1。因此,如果我们希望两条规则都适用,我们可以在它们之间加一个|,给我们:

    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
    我需要写d,这样当c的位为1时,结果中的对应位就是b中的对应位

    当c==1d=b时

    但当c的位为0时,结果中的对应位就是a中的对应位

    当c=0时,d=a

    这听起来像是位掩蔽的工作

    我知道您将这些作为测试数据:

    
    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));