二進制 1 2 4 8 16 32 64 128 512 1024 2048php
概念:二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是「逢二進一」,借位規則是「借一當二,至關於十進制的計算html
表示:算法
小數表示例子:spa
php中二進制表示,因爲二進制是整數的一種表達方式,因此php中浮點數無二進制表示3d
$a = 0b101011htm
運算:blog
加法:逢2進1內存
減法:借1當2get
乘法:乘法表效率
例子:
除法:
十進制
二進制,注意不夠除則補0,跳到下一位
特殊算法:拈加法
拈加法二進制是加減乘除外的一種特殊算法。
拈加法運算與進行加法相似,但不須要作進位。此算法在博弈論(Game Theory)中被普遍利用。
PHP中計算:
echo $a = 0b11000;//24
echo $b = 0b111;/7
echo $a+$b;//31
echo $a-$b;//17
echo $a*$b;//168
echo $a/$b;//3.4285714285714
位運算
位運算符容許對整型數中指定的位進行求值和操做,注意不可等於and,and爲邏輯運算符
$a = 0b11011;//27
$b = 0b101; //5
按位與&
echo $a & $b;//1
按位或|
echo $a | $b;//31
按位異或^
echo $a ^ $b;//30
按位取反~,&|^三個運算均須要1纔會是1,因此計算時,不須要補全位數,取反就不同了,以32位爲例
echo ~$a;//-28???不是4
首先要知道,在計算機中,負數以其正值的補碼形式表達
這樣咱們就要知道三個概念了,原碼,反碼和補碼,參考
http://www.javashuo.com/article/p-vlkefbkp-bo.html
一、正數的原碼、補碼、反碼均爲其自己;
二、負數(二進制)的原碼、補碼、反碼公式:
反碼 = 原碼(除符號位外)每位取反
補碼 = 反碼 + 1
反碼 = 補碼 - 1
三種類型的碼爲了更好的運算而進化而來,因此目前數據在內存中始終是以二進制形式存放的,數值是以補碼錶示的,在計算機運算的時候,都是以補碼的方式來運算的,計算而來的也是補碼,
回到27取反,爲-28
printf("%b", ~$a);將會打印出補碼
左移<< 向左移動,每移動一位至關於乘以2,移動一位至關於每一位都乘以2,相加而來的總數也是乘以2
因爲位移操做的運算速度比乘法的 運算速度高不少。所以在處理數據的乘法運算的時,採用位移運算能夠得到較快的速度
將全部對2的乘法運算轉換爲位移運算,可提升程序的運行效率
右移>>向右移動,並捨棄出界的數字,移動一位至關於除以2,
- 1 0 10進制
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 原碼
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 反碼
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 補碼 >>2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 補碼
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 反碼
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 原碼
- 3 10進制
-10>>2 = -3 -12>>2 = -3 -13>>2=-4
用處
一、權限管理
2^0=1,相應2進數爲」0001「 表明只讀權限
2^1=2,相應2進數爲」0010″ 表明寫入權限
2^2=4,相應2進數爲」0100″ 表明上傳權限
2^3=8,相應2進數爲」1000″ 表明刪除權限
或運算 7=4|2|1 至關因而只讀、寫入、上傳得集合
如何判斷是否有權限呢
與運算符
$key = 13
if($key & 8) 表明有刪除權限
二、其餘運用
判斷奇偶
a&1 = 0 偶數
a&1 = 1 奇數
取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
將int型變量a的第k位清0,即a=a&~(1<<k)
將int型變量a的第k位置1,即a=a|(1<<k)