zoukankan      html  css  js  c++  java
  • 二进制、位运算及其用处

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

  • 相关阅读:
    时寒冰先生文章转载
    [转]迭代经理是什么角色
    [转]如何抉择重构?
    面面俱到:SQL SERVER 2008主数据管理
    [转]用户故事【任务分解】和软件开发不得不说的故事
    读书心得3:去功利化&推荐两本书 转时寒冰
    沟通模式中的方式与过程
    系统分析与设计笔记 -系统类型
    加入敏捷团队宣言
    [转]敏捷进展学习 新项目Sprint
  • 原文地址:https://www.cnblogs.com/ValleyUp/p/10950238.html
Copyright © 2011-2022 走看看