这两个二进制逻辑表达式是否相等?

时间:2015-12-26 22:27:06

标签: c binary

考虑到这个问题:

  

根据变量x为以下值编写C表达式。   您的代码适用于任何字数w≥8。作为参考,我们会显示   评估x = 0x87654321的表达式的结果,w =   32。

     

B中。除了x的最低有效字节之外的所有字节都补充了   最低有效字节保持不变。 [0x789ABC21]。

我提出了解决方案:

(~x)^0xFF但提供的解决方案是:x ^ ~0xFF - 这些是等效的表达式吗?

3 个答案:

答案 0 :(得分:1)

实际上,并不总是等效,而且你的解决方案要好得多:

对于所有整数类型,

(~x) ^ 0xFF补充x并恢复低位字节。

x ^ ~0xFF更棘手:~0xFF将计算为int,然后在xoring之前扩展为x类型。如果x是大于int的整数类型且int的表示符号为+幅度,则可能无法按预期工作。

确实,以下代码:

unsigned long x = 12345678;
x = x ^ ~0xFF;

使用clang -Weverything生成以下警告:

xxo.c:4:13: warning: implicit conversion changes signedness: 'int' to 'unsigned long' [-Wsign-conversion]
x = x ^ ~0xFF;
      ~ ^~~~~

此外,请注意,如果w的尺寸小于int的尺寸,则两种表情都不正确。比如说int是32位而short是16位:

unsigned short x = 0x4321;

预期结果应为0xBC21,但是:

x ^ ~0xFF  ->  0x4321 ^ 0xFFFFFF00  ->  0xFFFFBC21

(~x) ^ 0xFF  ->  0xFFFFBCEF ^ 0xFF  ->  0xFFFFBC21

要解决此问题,应将表达式强制转换为x类型,最好是无符号类型。

最后,请注意您可以通过这种方式缩短表达式:0xFF ^ ~x

答案 1 :(得分:0)

你可以省略()。 〜优先于^ ...即使它没有(比如〜(x ^ 0xFF)),你仍会得到相同的结果...

Ain有趣吗?

答案 2 :(得分:0)

  1. XOR是对称二元运算符。因此~无关紧要。
  2. 只是一种思维模式:从x获取一个采样位并追踪其值: 在我们的左表达式中,每个1位变为由于0位的否定,然后在使用0xFF常数进行异或后再次为1位。出于同样的原因,0位变为0位。 在我们的右表达式上,我们碰巧XOR x,每个位的值为0。从XOR二进制表中可以很容易地看出x中的每个位将保持不变:1位保持不变,0位保持不变。而且你有它,表达式产生相同的结果。 简单回答的漫长道路......