私はJSのマニュアルを読んでいて、いいトリックを見つけました~val === (val != -1)
. 私はそれがいいと思ったので、自分の C コードで使用したいと思っています。
ポータブルですか?GNU/Linuxボックスをチェックしましたが、動作します。
編集:あまり明確に尋ねなかったようです。もちろん、私は知っています===
、Cにはありません.質問は、両方の条件です
int val;
if (~val) {...}
if (val != -1) {...}
同等?
私はJSのマニュアルを読んでいて、いいトリックを見つけました~val === (val != -1)
. 私はそれがいいと思ったので、自分の C コードで使用したいと思っています。
ポータブルですか?GNU/Linuxボックスをチェックしましたが、動作します。
編集:あまり明確に尋ねなかったようです。もちろん、私は知っています===
、Cにはありません.質問は、両方の条件です
int val;
if (~val) {...}
if (val != -1) {...}
同等?
いいえ、ちがいます。
まず、演算子「===」は C には存在しません。次に、「val != -1」という比較は、C では true (1) または false (0) を返します。
あなたが達成したいことは何ですか?
、 のコンテキストでif (exprA) vs if (exprB)
は
exprA := ~val
、
exprB := val!=-1
それらは等しいです。
(exprA) と (exprB) が同じ値に評価されるコンテキストでは、答えは No です。
どちら
exprA := ~val
の場合、同等の式は
exprB := val ^ -1
、または
exprB := val!=-1
の場合、同等の式は次のようになります。
exprA := !!(~val)
(val!=-1) は数値で 0 または 1 に評価されるため、改訂された質問は異なりますが、if ステートメントではゼロ以外の値を使用して条件 true を表すことができます。
したがって、答えは文脈によって異なります。
次の回答は、元の表現どおりに質問に対して書かれたものであり、私や他の人は、~ans
と(ans ^ -1)
が同等かどうかを尋ねていると考えるようになりました。
~val
このトリックは、2 の補数のマシンでのみ当てはまることを前提としているため、それほど移植性が高くありません-1 == 0b111111111...
(これは、今日の事実上すべてのマシンに当てはまります)。これは、xor 演算が「制御されたインバーター」として機能し、対応する右オペランド ビットが 1 である左オペランドの各ビットを反転させるという事実を利用しています。
ただし、代用~0
する-1
とうまくいくかもしれません。
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' の 2 つの特定の値以外は?
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 の補数法で負の数を格納するすべてのマシンで機能する必要があります。
ところで: 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
---------------------------------------------------------------