我們之前學過邏輯與(&&) 條件1 && 條件2 當兩邊條件同時成立時候返回1
邏輯或(||) 條件1 || 條件2 當兩邊條件只要有乙個成立時候返回1
一.& 按位與
只有對應的兩個二進位制位均為1時候,結果位才會是1,否則為0.
舉例: 比如9&5,其實就是1001&101 = 1,因此9&5=1
計算過程
1001php**0101
---------
0001
echo 9&5; //1二.| 按位或
只要對應的兩個二進位制位有乙個為1時,結果位就位1,否則為0。
舉例: 比如9|5,其實就是1001|101 = 1,因此9|5=13;
1001三. ^ 按位異或對應二進位制位相異(不相同)時,結果位1,否則為0.0101
---------
1101
舉例: 比如9^5,其實就是1001^101 = 1,因此9^5=12
10010101
---------
1100
echo 9^5; // 12如果自己異或自己呢
1001就是01001
---------
0000
那用自己在異或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 10011111 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>>n 等於8/2的n次方8>>1; //
4echo
8>>2; //
2echo
8>>3; //
1
七,利用位操作來實現變數值的互換
我們一般交換兩個變數的值都是利用乙個臨時變數來儲存中間的值
$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;位運算 利用異或^的規則 a^b^a == a^a^b == b$b = $b -$a;
$a = $b +$a;
echo sprintf("
a=%d,b=%d
",$a,$b);//
a=12,b=10
$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); //52.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 ...