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只有一个比特(由于这是逐比特操作,逻辑不会改变(:
- 当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。
因此,我们可以用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
只是出于一种传统感。