二进制、位运算及其用处
二进制 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)