按位否定检查

时间:2012-10-19 09:01:03

标签: c bit-manipulation

我正在阅读JS手册,并找到了很好的技巧~val === (val != -1)。 我发现它很好,并希望在我的C代码中使用它。

可携带吗?我检查了我的GNU / Linux盒子,它工作正常。

编辑:似乎我问得不太清楚。当然,我知道,C中没有===。 问题是,都是条件

int val;
if (~val) {...}
if (val != -1) {...} 

等于?

4 个答案:

答案 0 :(得分:0)

不,不是。

首先,运营商“===”不存在我C. 其次,比较“val!= -1”在C中返回true(1)或false(0)。

你想要完成什么?

答案 1 :(得分:0)

以下答案是针对该问题编写的,因为它原来是措辞,这导致我和其他人认为他在询问~ans(ans ^ -1)是否相同。

这个技巧不像~val那样可移植,因为它假设-1 == 0b111111111...,这只适用于两个补码机器(授予,几乎适用于任何机器)。它利用了xor操作作为“受控逆变器”的事实,在左操作数中翻转相应的右操作数位为1的每个位。

但是,用~0代替-1可能会有效。

答案 2 :(得分:0)

if (exprA) vs if (exprB)的背景下, exprA := ~val
exprB := val!=-1
他们是平等的。

在(exprA)和(exprB)评估相同值的上下文中,答案为否。

要么
exprA := ~val在这种情况下,等效表达式为
exprB := val ^ -1

exprB := val!=-1,在这种情况下,等效表达式可以是
exprA := !!(~val)

修订后的问题不同,因为(val!= - 1)在数值中求值为0或1,但if语句可以使用任何非零值来表示条件为真。

所以答案取决于背景。

答案 3 :(得分:0)

val!= -1将为1或0。

If val = 0,  ~0 = 0xFFFFFFFF on a 32 bit machine with 32 bit integer.
If val = 1,  ~1 = 0xFFFFFFFE on a 32 bit machine with 32 bit integer.

等等。

这个世界如何等于1或0?什么,但只有两个特定的'val'值?

根据Aki的陈述:你可能意味着~val = val ^ = -1。

xor truth table:
 --------------------
|A   |   B   |  A^B |
 --------------------
|0   |   0   |  0   | 
 --------------------
|0   |   1   |  1   |
 --------------------
|1   |   0   |  1   |
 --------------------
|1   |   1   |  0   |
 --------------------
example: val = 1:
1(val) is represented as : 0000 0000 0000 0000 0000 0000 0000 0001
-1 is represented as:      1111 1111 1111 1111 1111 1111 1111 1111
-------------------------------------------------------------------
         (XOR VAL AND -1): 1111 1111 1111 1111 1111 1111 1111 1110
--------------------------------------------------------------------
[negate:0to1 1to0]  ~val : 1111 1111 1111 1111 1111 1111 1111 1110
-------------------------------------------------------------------

由于这两者在逻辑上是相同的 - 并且所有机器都遵循逻辑,因此必须在每个以2的补码方法存储负数的机器上工作。

顺便说一句:2的补码是负数+ 1的1的补码:

因此存储-1:

-1 = negative     :   0000 0000 0000 0000 0000 0000 0000 0001
1' = 1s compliment:   1111 1111 1111 1111 1111 1111 1111 1110
2' = 2s compliemnt:   1111 1111 1111 1111 1111 1111 1111 1111
---------------------------------------------------------------