二进制、位运算及其用处

二进制 1 2 4 8 16 32 64 128 512 1024 2048

概念:二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二,相当于十进制的计算

表示:二进制、位运算及其用处

二进制、位运算及其用处

小数表示例子:二进制、位运算及其用处

php中二进制表示,由于二进制是整数的一种表达方式,所以php中浮点数无二进制表示

$a = 0b101011

运算

加法:逢2进1

二进制、位运算及其用处

减法:借1当2

二进制、位运算及其用处

 乘法:乘法表

二进制、位运算及其用处

例子:

二进制、位运算及其用处

除法:

十进制

二进制、位运算及其用处

二进制,注意不够除则补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

首先要知道,在计算机中,负数以其正值的补码形式表达

这样我们就要知道三个概念了,原码,反码和补码,参考

https://www.cnblogs.com/fangchunying/p/9022783.html

1、正数的原码、补码、反码均为其本身;
2、负数(二进制)的原码、补码、反码公式:
反码 = 原码(除符号位外)每位取反
补码 = 反码 + 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

 用处

1、权限管理

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) 代表有删除权限

2、其他运用

判断奇偶

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)