位元運算子(Bitwise Operator)
位元運算子其實不常用,新手可以略過這個章節沒關係
但是為了該章節的完整性,所以還是大略介紹一下
位元運算子是用來運算二進位數字的,不知道什麼是二進位的請先看
有興趣想要暸解多一點的話,可以看:為什麼電腦是只有0與1的世界?世界上只有10種人,一種是懂二進位的
而二進位的位元運算是根據以下的規則來做計算
範例 | 名稱 | 說明 | |
---|---|---|---|
$a & $b | 交集(And) | $a和$b的位元皆為1的部份為1 | |
$a \ | $b | 聯集(Or) | $a或$b的位元其中一方為1的部份為1 |
$a ^ $b | 互斥(Xor) | $a和$b的位元只有其中一方為1的部份為1 | |
~ $a | 補數(Not) | $a為1的部份為0,為0的部份為1 | |
$a << $b | 位元左移(Shift left) | $a往左移動$b個位元(意同$a乘以2的$b次方) | |
$a >> $b | 位元右移(Shift right) | $a往右移動$b個位元(意同$a除以2的$b次方之整數) |
交集(And):
<?php
echo 11&13; //output:9
/*
and運算就是雙方位元都是1的位元才輸出1,其他都輸出0
11(1011)
& 13(1101)
------------
9(1001)
*/
?>
聯集(Or):
<?php
echo 11|13; //output:15
/*
or運算就是雙方中一方位元是1就輸出1,雙方都是0才輸出0
11(1011)
| 13(1101)
------------
15(1111)
*/
?>
互斥(Xor):
<?php
echo 11^13; //output:6
/*
xor運算就是雙方中一方位元是1,另一方位元是0就輸出1,其他都輸出0
11(1011)
^ 13(1101)
------------
6(0110)
*/
?>
補數(Not):
<?php
echo ~11; //output:-12
/*
not運算就是將全部位元0換成1,1換成0
~ 11(1011)
------------
-12(0100)
*/
?>
左移(Shift Left):
<?php
echo 11<<2; //11往左邊移動2個位元,output:44
/*
左移運算就是將全部位元往左移兩格,然後右邊補上0
11(1011) ->左移一次,右邊補0-> 22(10110) ->左移一次,右邊補0-> 44(101100)
*/
?>
右移(Shift Right):
<?php
echo 11>>2; //11往右邊邊移動2個位元,output:2
/*
右移運算就是將全部位元往右移兩格,超出右邊個位數的位元就直接不要了,然後左邊邊補上0
11(1011) ->右移一次,左邊補0-> 5(0101) ->右移一次,左邊補0-> 2(0010)
*/
?>