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

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

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


所以我知道的是:

0x1D = 0001 1101

0xF0 = 1111 0000

我对changedSw行的功能感到困惑。我知道它会给输出0x02,但我不知道它是怎么做的。

最佳答案

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


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

08-05 22:59