我如何使用位运算符来实现这一点


int a = 0b1011011011;
int b = 0b1000110110;
int c = 0b0101010101;
int d = (a & b) ^ c; //Wrong

d的预期值为0b1010011110

我需要写d,这样当c的位为1时,结果中的相应位是b中的相应位组,但当c的位为0时,结果的相应位就是a中的相应位数。

我已经被这个问题困扰了一段时间,我似乎无法在一行中想出一些东西。

我之前有这个,但没有看到您的编辑。


int d = (c & b)^(~c & a) ;
  • q=c&当c为1时,b产生b,而与b无关
  • p=~c&当c为0时,a产生a,而与a无关
  • q^p只是保留a或b所独有的那些位,否则保留0

我觉得这是为了家庭作业,但无论如何我都会回答,因为很难在不给出答案的情况下解释这一点。

考虑两个简单的问题。忘记多个比特,假设a、b、c和d只有一个比特(由于这是逐比特操作,逻辑不会改变(:

  1. 当c为1时,d=b。当c为0时,d=0。
    当c和b都是1时,d最终为1。如果b或c为0,则d为0。
    这意味着d=b&c
  2. 当c为0时,d=a。当c为1时,d=0。
    这与情况#1非常相似,只是c被翻转,a被替换为b。
    因此,我们可以用a替换b,用~c替换c来获得此解
    这意味着d=a&c

现在回答您最初的问题:如果我们举这两个更简单的例子,我们可以看到它们不可能都是1。因此,如果我们希望两个规则都适用,我们可以在它们之间加一个|,得到:
d=(b&c(|(a&~c(。

我需要写d,这样当c的位为1时,结果中的相应位就是b中的相应比特,

当c==1 d=b 时

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

当c==0 d=时

这听起来像是一个比特掩蔽的工作!

我知道你把这些作为你的测试数据:

int a = 0b1011011011;
int b = 0b1000110110;
int c = 0b0101010101;
int d = 0b1010011110;

但是这个测试数据是一个很好的测试,更容易阅读。我所做的只是重新排列位列,这样c就不会经常更改:

int a = 0b11011_01101;
int b = 0b10101_00110;
int c = 0b00000_11111;
int d = 0b11011_00110;

自从Java7以来,我们还可以在数字文字中使用下划线,让它们看起来更容易。

现在应该很容易看出,c控制着d从哪里复制,a或b。易于读取的数据也很重要。

现在,一些比特屏蔽

assertTrue(b & c ==0b00000_00110);
assertTrue(a & ^c==0b11011_00000);

或者他们在一起,你会得到:

int d = 0b11011_00110;
assertTrue(d == (b & c) | (a & ^c));

尝试使用任一数据集。应该仍然有效。

你也可以把它们放在一起xor。这并不重要,因为c掩码否定已经排除了两边1的可能性。我选择or只是出于一种传统感。

相关内容

最新更新