考虑到这个问题:
根据变量x为以下值编写C表达式。 您的代码适用于任何字数w≥8。作为参考,我们会显示 评估x = 0x87654321的表达式的结果,w = 32。
B中。除了x的最低有效字节之外的所有字节都补充了 最低有效字节保持不变。 [0x789ABC21]。
我提出了解决方案:
(~x)^0xFF
但提供的解决方案是:x ^ ~0xFF
- 这些是等效的表达式吗?
答案 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)
~
无关紧要。x
获取一个采样位并追踪其值:
在我们的左表达式中,每个1位变为由于0位的否定,然后在使用0xFF
常数进行异或后再次为1位。出于同样的原因,0位变为0位。
在我们的右表达式上,我们碰巧XOR x
,每个位的值为0。从XOR二进制表中可以很容易地看出x中的每个位将保持不变:1位保持不变,0位保持不变。而且你有它,表达式产生相同的结果。
简单回答的漫长道路......