PHP php位運算及其高階應用

2022-05-19 10:50:11 字數 4500 閱讀 1185

我們之前學過邏輯與(&&)      條件1 && 條件2 當兩邊條件同時成立時候返回1

邏輯或(||)         條件1 || 條件2    當兩邊條件只要有乙個成立時候返回1  

一.& 按位與

只有對應的兩個二進位制位均為1時候,結果位才會是1,否則為0.

舉例: 比如9&5,其實就是1001&101 = 1,因此9&5=1

計算過程

1001

0101

---------

0001

php** 

echo  9&5;   //1
二.|   按位或

只要對應的兩個二進位制位有乙個為1時,結果位就位1,否則為0。

舉例: 比如9|5,其實就是1001|101 = 1,因此9|5=13;

1001

0101

---------

1101

三. ^ 按位異或對應二進位制位相異(不相同)時,結果位1,否則為0.

舉例: 比如9^5,其實就是1001^101 = 1,因此9^5=12

1001

0101

---------

1100

echo  9^5;  // 12
如果自己異或自己呢

1001

1001

---------

0000

就是0

那用自己在異或0

1001

0000

---------

1001

得到的還是自己。

根據上面分析得到如下規律

相同整數^的結果是0,比如5^5=0

多個整數相^的結果跟順序無關,比如5^6^7 = 5^7^6

任何數值跟0進行異或,結果還是等於原來的數值,比如 9^6^9 = 9^9^6 = 0^6 = 6

應用:根據上面原理,加密演算法中,可以使用使用異或運算子進行加密與解密,在二進位制運算中,如果將乙個明文的二進位制位與金鑰進行按位「異或」運算,將得到密文,將此密文與金鑰再次進行按位「異或」運算,又可以得到明文。這樣,只需編寫乙個函式便可以同時完成加密和解密兩種運算。

四. ~ 按位取反

把每個二進位制位取反,它是單目運算子,只操作乙個數。

舉例: ~9  把9每個二進位制位取反。

~0000 0000 0000 0000     0000 0000 0000  1001

1111 1111 1111 1111 1111 1111 1111 0110 開頭第乙個數是符號位 這裡得出為負數

echo  ~9;   // -10
五. << 位運算左移

把整數的各個二進位制位全部左移n位,高位要放棄,低位補0,左移n位其實就是乘以2的n次方。

由於左移位是丟棄最高位,0補最低位,所以符號位也要丟棄,左移後的結果可能會改變正負性

舉例:  <<9

下面用0做參考

將9左移一位,最高位也就是紅色的0出來,然後被捨棄,低位補0如下

計算出9左移一位後的值是

echo

9<<1; //

18

在計算下

echo

9<<2; //

36 相當於 9*4=18 在相當於 9*2的2次方

echo

9<<3; //

72 相當於 9*6=72 在相當於 9*2的3次方

echo

9<<4; //

144 相當於 9*16=144 在相當於 9*2的4次方

得出規律

9 << n  = 9*2的n次方

所以可以引申計算的時候,比如 9*6 就是等於  9<<3,而且位運算比較快。
注意一點,最高位如果是1倍丟棄,後面那一位是0,所以會影響正負性的。

六. >> 位運算右移

把整數的各個二進位制位全部右移n位,保持符號位不變,右移n位其實就是除以2的n次方。

為正數時,符號位為0,最高位補0。

為負數時,符號位為1,最高位是補0或者補1,這取決於編譯系統的規定。

舉例:  把9右移一位,如下,由於保持符號位不變,左邊第二個是空,右邊第乙個被移出來

然後空出來的用符號位補齊,這裡符號位是0,所以就用0補齊,如下

echo

9>>1; //

4echo

8>>1; //

4 8右移一位也等於4

右移和左移也有規律

echo

8>>1; //

4echo

8>>2; //

2echo

8>>3; //

1

得出8>>n   等於8/2的n次方

七,利用位操作來實現變數值的互換

我們一般交換兩個變數的值都是利用乙個臨時變數來儲存中間的值

$a = 10

;$b =12

;$temp =$a;

$a =$b;

$b =$temp;

echo sprintf("

a=%d,b=%d

",$a,$b);//

a=12,b=10

或者

$a = $b -$a;

$b = $b -$a;

$a = $b +$a;

echo sprintf("

a=%d,b=%d

",$a,$b);//

a=12,b=10

位運算   利用異或^的規則  a^b^a == a^a^b == b

$a = $a ^$b;

$b = $a ^$b;

$a = $a ^$b;

echo sprintf("

a=%d,b=%d

",$a,$b);//

a=12,b=10

結果也是一樣的

八.利用位運算判斷奇偶性

一般用取模的方法來判斷是否是奇偶數

比如:10%2 == 0 那麼就是偶數 否則是奇數

根據檢視 二進位制中 最後一位如果是1那麼就是奇數 ,如果是0那麼就是偶數。如下:

15 的而二進位制數 : 0000 1111

9  的而二進位制數 : 0000 1001

14 的而二進位制數 : 0000 1110

10 的而二進位制數 : 0000 1010

位於運算,只有當對應的二進位制數都是1的時候才是1,否則為0

$a & 1 == 1 //奇數

$a & 1 == 0 //偶數

運算符號

意義運算物件型別

運算結果型別例項~

非運算整型,字元型

整型~a

&與運算

a & b

|或運算

a | b

^異或運算

a ^ b

<<

位左移運算

a<<4

>>

位右移運算

a>>2

使用位運算案例:

1.兩數字求和

//

兩數字相加 (不支援小數)

function

add($num1, $num2)

if ($num2 == 0

) $xorresult = $num1 ^$num2;

$carry = ($num1 & $num2)<<1

; return add($xorresult,$carry);

}

echo add(3,2);  //5
2.php 函式error_reporting() 設定 php 的報錯級別並返回當前級別。

error_reporting(e_all & ~e_notice)
錯誤報告是按位的,先取得 e_all 的值(二進位制)然後 再取得 e_notice 的值(二進位制),然後在通過 ~ 將其取反。

error_reporting(e_all ^ e_notice);//顯示除去 e_notice 之外的所有錯誤資訊 。

error_reporting(e_all^e_warning^e_notice);//顯示除去e_warning e_notice 之外的所有錯誤資訊 。

位運算及其應用

按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1。按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1。取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1變0。左移 用來將乙個數的各二進位制位全...

位運算及其應用詳解

位運算子 位運算是以二進位制位為單位進行的運算,其運算元和運算結果都是整型值。todo 字元型 char 位運算子共有7個,分別是 位與 位或 位非 位異或 右移 左移 0填充的右移 一 邏輯運算子 1.位與運算 1 運算規則 位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運...

位運算及其應用詳解

一 邏輯運算子 1.位與運算 1 運算規則 位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。例如 int型常量4和7進行位與運算的運算過程如下 4 0000 0000 0000 0100 7 0000 0000 0000 0111 0000 0000 0000 0100 ...