2015-06-09 73 views
0

我正在學習位運算符,爲此我在tutsplus上提取了article。那麼,它寫得很好。我可以理解&|運營商,但~搞砸了。例如,如文章中所述:瞭解〜運營商

其實就是這樣!翻轉從真布爾值爲假或者反之亦然, 〜運算符逆轉的整數每個二進制位:從0到1 和1到0

的製品已假定OS正存儲整數作爲1 byte8 bits。我正在關注它。我正在使用PHP進行試驗。代碼的下面:

$b = 12; 
$NOR = ~$b; 

/* 
* ------------------------ 
* | $b | 0 0 0 0 1 1 0 0 | = 12 
* ------------------------ 
* | ~ | 1 1 1 1 0 0 1 1 | = 243 as 1 + 2 + 16 + 32 + 64 + 128 = 243 
* ------------------------ 
* Each digit will be inverted. 
*/ 

echobr($NOR); 

即使我們認爲$b被存儲爲32 bit。然後倒數值應該是> 243。相反,它返回-13echobr()是我定義的函數。

如果可以解釋,這將是非常有益的。

回答

3

$ B = 0000 0000 0000 0000 0000 0000 0000 1100

〜$ B = 1111 1111 1111 1111 1111 1111 1111 0011 = -13

注意,PHP使用two's complement表示,這意味着最有效位是符號位,這裏'1'是指' - '。你可以在這裏閱讀更多關於標誌位Sign bit-Wikipedia

由於事實上,在PHP的任何符號整數, - $ I = =〜$ I + 1

+1

這幾乎每一臺機器是真的在那裏,但在技術上是正確的,你應該提到,這假定2的補碼。還有其他可能的表示形式,其中'-i'不一定是'〜i + 1'。請參閱http://en.wikipedia.org/wiki/Signed_number_representations –

+1

@FilipeGonçalves謝天謝地,PHP總是使用二進制補碼。這是關於它唯一正確的事情.. – harold

+0

@harold哈。我不知道。我不做任何PHP編程,我也不知道這門語言。很高興知道,謝謝你的加入。 –