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)

  • 相关阅读:
    uni-app 发起请求,Toast 消息提示 ,跳转页面
    uView初识
    uni-app初识
    docker目录 /var/lib/docker/containers 日志清理
    Linux中使用pigz工具更快的压缩和解压文件
    docker 修改默认网段
    LayaAir提示:版本不匹配!全局tsc(2.7.2)!=VS Code的语言服务(2.1.5)。可能出现不一致的编译错误
    C++ 格式化 浮点为字符串
    安装 ta-lib
    编译 python 代码
  • 原文地址:https://www.cnblogs.com/ValleyUp/p/10950238.html
Copyright © 2011-2022 走看看