理解位運算

junwind發表於2021-09-15

我們以整數來說,php中整型資料佔記憶體8byte,也就是64bit位,每個位要麼是0,要麼是1;
我們用左邊第一位作為符號位,0為正,1為負;

  1. 原碼:十進位制轉換成的二進位制
    10000000 ... 00000101  -5原碼
  2. 反碼則是在原碼基礎上,符號位不變,其它位取反
    11111111 ... 11111010    -5反碼
  3. 補碼則是在反碼的基礎上+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  溢位最高位為000000000 ... 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 協議》,轉載必須註明作者和本文連結
六月的風