2013-10-09 61 views
0

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

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

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

所以我知道什么是:

0x1D = 0001 1101

0XF0 = 1111 0000

林困惑什么的changedSw线在做什么。我知道它会给出输出0x02,但我无法弄清楚它是如何做到的。

+1

在纸上逐个执行操作。首先进行'NewSw'的反转,然后是XOR,然后是'OldSw'的反转,最后是AND。然后你就会知道到底发生了什么,为什么。 –

+0

所以NewSw在反转正确后会变成0000 1111?然后异或将它带到0x0D。那么我会和那个倒立的老年人? – user081608

+0

是的,这就是发生了什么事。 –

回答

0

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

意指 “的OldSw零一个部分和逆另一部分”。 NewSw表示将OldSw的哪些位清零以及反转哪些位。即,NewSw中的1表示要被清零的位,0表示要被反转的位。

该操作分两步执行。

第1步反转位。

(OldSw^~NewSw)

0001 1101 
^ 0000 1111 
    --------- 
    0001 0010 

看,我们倒该是0的原NewSw位。

第2步:在上一步中未被反转的零位。

& ~OldSw

0001 0010 
& 1110 0010 
    --------- 
    0000 0010 

看,它并没有改变倒位,但零所有的休息。

+0

'OldSw'为零oldSW中的位,而不是前一步中未反转的位。另外*“NewSw中的1表示要清零的位”*具有误导性。 –

+0

@MartinR“将oldSW中的零置零” - 这是什么意思? OldSw中的位1为零,但结果为0x02。看,结果中位1不是零位。它如何被调零? – kotlomoy

+0

对不起,我弄错了方向。'&〜OldSw'在OldSW中清零* one *的位。我的观点只是,这一步与NewSw无关,独立于前一步。 –

-1

第一部分将是1F即。 0001 1111.So时〜oldsw(1110 0010) 结束操作是这样的:

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

所以输出将是2,波浪线操作员1的补数。

+0

你是如何获得1F的? – user081608

+3

答案不正确。中间步骤,即“OldSw^NewSw”不是“0x1F”。它应该是'0001 0010'或'0x12' – Pankrates