【问题标题】:Logic of a bit masking XOR code位掩码 XOR 码的逻辑
【发布时间】: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 不。如果两个位相等,则异或为零。

标签: c logic hardware bit


【解决方案1】:

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

你看,它不会改变反转的位,而是将其余的都归零。

【讨论】:

  • & ~OldSw 将 oldSW 中为零的位清零,而不是在上一步中未反转的位。 “NewSw 中的 1 表示要归零的位” 具有误导性。
  • @MartinR“将 oldSW 中为零的位归零”——这是什么意思? OldSw 中的位 1 为零,但结果为 0x02。看,位 1 在结果中只是不是零位。怎么可能归零?
  • 抱歉,我弄错了。 & ~OldSw 将 OldSW 中 one 的位清零。我的观点只是这一步独立于NewSw,独立于上一步。
  • 您的计算是正确的,我的评论仅指解释文本。
【解决方案2】:

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

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

所以输出将是 2。波浪号运算符是 1 的补码。

【讨论】:

  • 你是怎么拿到1F的?
  • 答案不正确。中间步骤,即OldSw ^ ~NewSw 不是0x1F。应该是0001 00100x12
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2019-05-07
  • 2017-02-23
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多