二進制、位運算及其用處

二進制 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)

相關文章
相關標籤/搜索