我們以整數來說,php中整型資料佔記憶體8byte,也就是64bit位,每個位要麼是0,要麼是1;
我們用左邊第一位作為符號位,0為正,1為負;
- 原碼:十進位制轉換成的二進位制
10000000 ... 00000101 -5原碼
- 反碼則是在原碼基礎上,符號位不變,其它位取反
11111111 ... 11111010 -5反碼
- 補碼則是在反碼的基礎上+1
11111111 ... 11111011 -5補碼
可以看到負數是以補碼形式儲存
正數的原碼,反碼,補碼,都是原碼;
負數以補碼的形式儲存,得到原碼也很簡單,將補碼-1,得到反碼,然後取反(符號位不變),得到原碼;
計算機能表示的最大正整數
01111111 ... 11111111,即2^63 - 1
我們看+0,-0
+0
原碼:00000000 ... 00000000
反碼:00000000 ... 00000000
補碼: 00000000 ... 00000000
-0
原碼: 10000000 ... 00000000
反碼: 11111111 ... 11111111
補碼:100000000 ... 00000000 溢位最高位為0 , 00000000 ... 00000000
最終+0與-0的補碼一致,因此儲存的一致
資料存到計算機,最終都是二進位制的,1bit存一位二進位制數字
&
按位與,兩位都為1,則結果為1,否則為0|
按位或,兩位有一個為1,則結果為1,否則為0^
按位異或,兩位不同則為1,相同則為0~
按位取反,本身為1則為0,本身為0則為1<<
按位左移,全部位向左移,右邊補0>>
按位右移,全部位向右移動,左邊補符號位
$a = 5;
$b = 3;
//按位與
echo $a & $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000001 //最終結果:1
//按位或
echo $a | $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000111 //最終結果:7
//按位異或
echo $a ^ $b;
//00000000 ... 00000101
//00000000 ... 00000011
//00000000 ... 00000110 //最終結果:6
//按位取反
echo ~$a;
//00000000 ... 00000101
//11111111 ... 11111010 //注意:這是異或後的結果:符號位為1,表示你負數(系統為補碼),所以要輸出的話要轉化成原碼
//11111111 ... 11111001 //反碼:補碼-1
//10000000 000 00000110 //原碼:符號位不變,其他位取反,最終結果-6
//按位左移
echo $a << 1;
//00000000 ... 00000101
//00000000 ... 00001010 //最終結果:10
//按位右移
echo $a >> 1;
//00000000 ... 00000101
//00000000 ... 00000010 //最終結果:2
echo -5 >> 1;
在不使用第三方變數的情況下,交換兩個變數的值
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,$b; //35,實現交換
本作品採用《CC 協議》,轉載必須註明作者和本文連結