我正在阅读JS手册,并找到了很好的技巧~val === (val != -1)
。
我发现它很好,并希望在我的C代码中使用它。
可携带吗?我检查了我的GNU / Linux盒子,它工作正常。
编辑:似乎我问得不太清楚。当然,我知道,C中没有===
。
问题是,都是条件
int val;
if (~val) {...}
if (val != -1) {...}
等于?
答案 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
---------------------------------------------------------------