我有一个代码,可以更改两组十六进制数字,然后将它们存储到新的无符号字符中。该代码如下所示:
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
瞧,它不会改变反转位,但其余所有位都为零。