掩码XOR代码的逻辑

时间:2013-10-09 06:40:50

标签: c logic hardware bit

我有一个代码可以更改两组十六进制数,然后将它们存储到一个新的unsigned char中。代码如下所示:

unsigned char OldSw = 0x1D;
unsigned char NewSw = 0xF0;
unsgined char ChangedSw;

ChangedSw = (OldSw ^ ~NewSw) & ~OldSw;

所以我所知道的是:

0x1D = 0001 1101

0xF0 = 1111 0000

我对changeSw行正在做什么感到困惑。我知道它会给输出0x02,但我无法弄清楚它是如何做到的。

2 个答案:

答案 0 :(得分:0)

ChangedSw = (OldSw ^ ~NewSw) & ~OldSw;

这意味着“OldSw的零部分与其他部分相反”。 NewSw表示OldSw的哪些位为零,以及要反转的位。即,NewSw中的1表示要归零的位,0表示要反转的位。

此操作分两步执行。

步骤1.反转位。

(OldSw ^ ~NewSw)

  0001 1101
^ 0000 1111
  ---------
  0001 0010

请注意,我们将原始NewSw中的0位反转。

步骤2.在前一步骤中未反转的零位。

& ~OldSw

  0001 0010
& 1110 0010
  ---------
  0000 0010

看,它不会改变反转位,但是所有其余位都为零。

答案 1 :(得分:-1)

第一部分是1F即。 0001 1111.So以~oldsw结束时(1110 0010) 操作将是这样的:

0001 1111
1110 0010
----------
0000 0010

因此输出将是2.波浪号运算符是1的补码。