我有一个代码可以更改两组十六进制数,然后将它们存储到一个新的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,但我无法弄清楚它是如何做到的。
答案 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的补码。