2012-10-19 34 views
0

我正在閱讀JS手冊,並發現很好的竅門,即~val === (val != -1)。 我發現它很好,並希望在我的C代碼中使用它。按位否定檢查

它是否便攜?我檢查了我的GNU/Linux盒,它的工作。

編輯:似乎我問得不太清楚。當然,我知道,有沒有===在C. 問題,都是條件語句

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

平等的嗎?

+0

必須意味着〜VAL ===(VAL^= -1) –

+0

如果val是-1,那麼你的句子是錯誤的。 –

+0

在你的代碼中使用'〜val',這樣就不會混淆任何人。 – Andrey

回答

0

以下的答案是爲因爲它最初表述的問題,這導致我和其他人認爲他是問~ans(ans^-1)是否是等價的寫入。

這個技巧並不像~val那樣便攜,因爲它假定-1 == 0b111111111...,這隻在二補碼機上纔是真實的(當然,它適用於今天的任何機器)。它利用xor操作作爲「受控逆變器」的事實,翻轉左操作數中相應右操作數位爲1的每一位。

但是,用~0代替-1可能會起作用。

+0

好主意。但我認爲'〜0'並不是負面的,對吧? – KAction

+0

唉,重點不是讓它成爲負面的,而是要產生所有1的位模式,我相信〜0總會完成。 :) –

+0

所有關於'indexOf'這樣的函數。另外,在哪種計算機上它實際上失敗了?整數表示取決於內核,編譯器,硬件? – KAction

0

不,它不是。

首先,操作者 「===」 不存在我C. 其次,比較 「VAL!= -1」 返回true(1)或假(0)C.

什麼你想完成嗎?

+0

他使用「===」表示等同。他希望翻轉價值二進制中的所有位,這是Aki的評論會做的。 – WhozCraig

0

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。

所以答案取決於上下文。

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 
---------------------------------------------------------------