【发布时间】:2013-10-09 06:40:50
【问题描述】:
我有一个代码可以更改两组十六进制数字,然后将它们存储到一个新的无符号字符中。代码如下所示:
unsigned char OldSw = 0x1D;
unsigned char NewSw = 0xF0;
unsgined char ChangedSw;
ChangedSw = (OldSw ^ ~NewSw) & ~OldSw;
所以我知道的是:
0x1D = 0001 1101
0xF0 = 1111 0000
我对 changedSw 行的作用感到困惑。我知道它会给出输出 0x02 但我不知道它是如何做到的。
【问题讨论】:
-
在纸上一一执行操作。首先进行
NewSw的反转,然后是XOR,然后是OldSw的反转,最后是AND。然后你就会确切地知道发生了什么以及为什么。 -
所以 NewSw 在反转后会变成 0000 1111 正确吗?然后 XOR 会将其带到 0x0D。然后我会 AND 那与倒置的 oldSw?
-
是的,就是这样。
-
这只是
ChangedSw = ~ (OldSw | NewSw);的复杂写法。 -
@JoachimPileborg 不。如果两个位相等,则异或为零。