我正在閱讀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) {...}
平等的嗎?
以下的答案是爲因爲它最初表述的問題,這導致我和其他人認爲他是問~ans
和(ans^-1)
是否是等價的寫入。
這個技巧並不像~val
那樣便攜,因爲它假定-1 == 0b111111111...
,這隻在二補碼機上纔是真實的(當然,它適用於今天的任何機器)。它利用xor操作作爲「受控逆變器」的事實,翻轉左操作數中相應右操作數位爲1的每一位。
但是,用~0
代替-1
可能會起作用。
不,它不是。
首先,操作者 「===」 不存在我C. 其次,比較 「VAL!= -1」 返回true(1)或假(0)C.
什麼你想完成嗎?
他使用「===」表示等同。他希望翻轉價值二進制中的所有位,這是Aki的評論會做的。 – WhozCraig
在if (exprA) vs if (exprB)
上下文中,
exprA := ~val
,
exprB := val!=-1
它們是相等的。
在(exprA)和(exprB)評價爲相同的值的情況下,答案是
號要麼
exprA := ~val
在這種情況下,等效的表達式是
exprB := val^-1
,或
exprB := val!=-1
,在這種情況下,等效表達式可能是
exprA := !!(~val)
修訂後的問題是dif但是,如果語句可以使用任何非零值來表示條件爲真,則(val!= - 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'的兩個具體值之外什麼都沒有?
根據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
---------------------------------------------------------------
必須意味着〜VAL ===(VAL^= -1) –
如果val是-1,那麼你的句子是錯誤的。 –
在你的代碼中使用'〜val',這樣就不會混淆任何人。 – Andrey