PHP匿點之位運算按位取反

2021-07-22 10:33:21 字數 1394 閱讀 7223

我們看示例:

<?php

$a = 8;

var_dump(~$a);

先不要看結果, 試想下結果是多少? 

然後我們執行下看看, 納尼? 和我們設想的不一樣,奇怪了  什麼原因呢

於是我們翻看php中文手冊: 

~ $a 

not(按位非) 

將 $a 

中為 0 

的位設為 

1,反之亦然。 

我只是簡單的理解為:0變1,1變0。原來按位取反以十進位制輸出並不是簡單理解成這樣。

首先要知道,在計算機中,負數以其正值的補碼形式表達。

這樣我們就要知道三個概念了,原碼,反碼和補碼。

原碼:乙個整數,按照絕對值大小轉換成的二進位制數,稱為原碼。

反碼:將二進位制數按位取反,所得的新二進位制數稱為原二進位制數的反碼。取反操作指:1變0, 0變1。

補碼:反碼加1稱為補碼。也就是說,要得到乙個數的補碼,先得到反碼,然後將反碼加上1,所得數稱為補碼。

正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1

由上所知,8按位取反以十進位制輸出的過程:

//8的原碼

echo sprintf("%032b", 8);

1、8的原碼為:0000 0000 0000 0000 0000 0000 0000 1000

2、按位取反:1111 1111 1111 1111 1111 1111 1111 0111;由於最前面一位為1,所以為負數。即即按位取反後得的為負數

下面以十進位制輸出:負數以其正值的補碼形式表達:

3、2步所得的數(是其正為取反,符號不變,最高位還是為1)取反:1000 0000 0000 0000 0000 0000 000 1000

4、反碼加1:1000 0000 0000 0000 0000 0000 000 1001;這樣就得負數的正值的補碼形式。也就是-9了。

再舉一例子

如2按位取反

0000 0000 0000 0000 0000 0000 0000 0010(原碼)

1111 1111 1111 1111 1111 1111 1111 1101(按位取反)

1000 0000 0000 0000 0000 0000 000 0010 (正值的反碼,符號不變)

1000 0000 0000 0000 0000 0000 000 0011 (加1,結果為-3)

**和結果如下:

<?php

$a=2;

$b=~$a; //按位取反

echo "\$a=".$a."

";echo "\$b=".$b;

?>

結果:$a=2

$b=-3 

按位取反運算解析

今天我在看簡明python指南的時候,看到其中乙個計算機計算的問題,它是這樣描述的 x的按位取反結果為 x 1 5 輸出 6。有關本例的更多細節可以參閱 看到這兒我就疑惑了,之前在大學中學習的計算機基礎課程又還給教材了,hhh 無奈,我只好取網上搜尋解析的答案,而網上的解釋說得不太讓人明白,自己結合...

JAVA按位取反運算

按位取反是對補碼進行運算,當運算完後,再將補碼變回原碼。這個符號為按位取反運算子。按位取反的運算規則為0變成1,1變成0.0 1,1 0 有這麼乙個題 1.求 9的結果是什麼 解 9的二進位制數表示 0000 1001 9的原碼 0000 1001 9的反碼 0000 1001 9的補碼 0000 ...

PHP匿點之巧用位運算子 和

先來回顧下來自官方的位運算子說明 1 位左移 實質是將對應的資料的二進位制值逐位左移若干位,並在空出的位置上填0,最高位溢位並捨棄。例 如 a 10 b a 2 b 40 根據手冊描述可以看出位運算可以看出向左移一位,則是實現乘2運算。效能 位移操作的運算速度比乘法的 運算速度高很多。因此在處理資料...