1. 程式人生 > >PHP位運算符

PHP位運算符

height 文章 右移 -a com 數字 AD post 位移

位運算符

位運算符是指對二進制位從低位到高位對齊後進行運算。

符號作用舉例個人理解
& 按位與 $m & $n 全1為1,否則為0
| 按位或 $m | $n 全0為0,有1為1
^ 按位異或 $m | $n 不同為1,相同為0
~ 按位取反 ~$m
<< 向左移位 $m << $n
>> 向右移位 $m >> $n

  正數的原碼,反碼、補碼都是一樣的,負數不一樣

  原碼:數字的8位 二進制,符號位(第一位)為0表示正數,為1表示負數

  反碼:正數反碼與原碼一樣,負數的反碼是符號位1不變,整數的每一位二進制數位求反,得到反碼

  補碼:正數補碼與原碼一樣,負數反碼的符號位1不變,按位取反,末尾(最低位)加1;計算機中的運算都是以補碼的形式運算的,存儲也是補碼

     補碼的特性:
    1、一個負整數(或原碼)與其補數(或補碼)相加,和為模。
    2、對一個整數的補碼再求補碼,等於該整數自身。
    3、補碼的正零與負零表示方法相同。
  

&運算符

<?php
$m = 1;
$n = 2;
$mn = $m & $n;
echo $mn;

運行結果為0

解釋:將1,2分別轉換為二進制(8 位)為

00000001

00000010

在按位與的過程中,按位比較,全1為1,比較結果為00000000,所以輸出0。

負數的 & 運算

以2&-7=?計算為例:

(1)、計算2的補碼: 2->原碼:00000010->反碼:00000010->補碼:00000010

(2)、計算-7的補碼: -7->原碼:10000111->反碼:11111000->補碼:11111001

(3)、計算2&-7的補碼->反碼->原碼 2&-7補碼:00000000->反碼:00000000->原碼:00000000

(4)、有2&-7原碼得到2&-7的值 所以2&-7 = 0


|運算符

<?php
$m = 1;
$n = 2;
$mn = $m | $n;
echo $mn;

運行結果為3,同樣,轉換成如上的二進制

00000001

00000010

在按位或的過程中,有1為1,全0為0,則結果為00000011,所以輸出3。

^運算符

<?php
$m = 1;
$n = 2;
$mn = $m ^ $n;
echo $mn;

運行結果為3,同樣,轉換成如上的二進制

00000001

00000010

在按位亦或的過程中,不同為1,相同為0,所以結果為00000011,進而輸出3。

~運算符

<?php
$m = 2;
$m1 = ~$m;
echo $m1;

運行結果為-3,此處引人深思。

註:在計算機中,負數以其正值的補碼形式表達。

1: 2的32位原碼為 0000 0000 0000 0000 0000 0000 0000 0010

2: 按位取反後為 1111 1111 1111 1111 1111 1111 1111 1101

由於最前面的數為1,符號位為1,即為負數,所以,以其正值的補碼形式表示為:(反碼的符號位不變,按位取反,末尾加1)

1000 0000 0000 0000 0000 0000 0000 0011

所以輸出為-3。

<<運算符

<?php
$m = 3;
$m1=$m << 1;
echo $m1;

運算結果為6

左移運算的實質是將對應的數據的二進制值逐位左移若幹位,並在空出的位置上填0,最高位溢出並舍棄。

3的32位原碼為,0000 0000 0000 0000 0000 0000 0000 0011

左移一位:0000 0000 0000 0000 0000 0000 0000 0110

所以為6

根據手冊描述可以看出位運算可以看出向左移一位,則是實現乘2運算。由於位移操作的運算速度比乘法的 運算速度高很多。因此在處理數據的乘法運算的時,采用位移運算可以獲得較快的速度。
提示 將所有對2的乘法運算轉換為位移運算,可提高程序的運行效率。

>>運算符

  右移一位,和<<運算符,類似,只不過這個是右移。

查看文章:原碼、反碼、補碼之間的轉換和簡單運算

php位運算詳解

PHP位運算符詳解

PHP位運算符