• PHP 位运算


    位运算:

    一、先求出二进制:
    -3原码: 10000000 00000000 00000000 00000011  
    -3反码: 11111111 11111111 11111111 11111100 //取反,但符号位不变。
    -3补码: 11111111 11111111 11111111 11111101 //反码加1

    注意:
    1、正数的原码、反码、补码都是一样的。
    2、计算机运算是以补码形式进行的,故计算时先统一转成补码,计算后(补码)逆转成原码。

    二、按位与& :除去符号位,同1为1。
    例:-3&2
    -3 补码:11111111 11111111 11111111 11111101
     2 补码:00000000 00000000 00000000 00000010     
    结果补码:00000000 00000000 00000000 00000000//最高位也参与运算,因为一正一负,总得有个了断吧
         结果:0,由于正数三码统一,故处已是结果,补码即原码。

    例:-3&-6
    -3 补码:11111111 11111111 11111111 11111101
    -6 补码:11111111 11111111 11111111 11111010
    结果补码:11111111 11111111 11111111 11111000
    结果反码:11111111 11111111 11111111 11110111//补码减1
    结果原码:10000000 00000000 00000000 00001000 //反码再求反之后,-8

    总结:
    1、有正为正。
    2、在结果为负,并且左边全是1,右边全是0,则结果从最后一个 1 取到最后,即:11111000 => 1000 => 8 => -8
    2、当一个负数是2^n时,它的补码:补码等于原码有效数字所位,前补1,后补0。
    -8 => 1 <1> 000 => 11000 //当然,前面还可以补许多1,但没意义,只要位数够运算就行
    -2 => 1 <1> 00 =>  11100

    11000
    11100
    11000//结果补码,结果便是:1000 => 8 取负,-8

    三、按位或| :除去符号位,有1为1
    例:-3|-6
    -3 补码:11111101
    -6 补码:11111010
    结果补码:11111111
    结果反码:11111110//补码减1
    结果原码:00000001 //反码再求反,-1

    总结:
    1、有负为负。

    四、按位异或^ :相异为1,相同为0
    例:-3^-6
    -3 补码:11111101
    -6 补码:11111010
    结果补码:00000111//已然为正,故为7

    总结:同号为正,异号为负。

    五、按位取反~ :0、1互换
    例:~-3
    -3 补码:11111101
    结果补码:00000010//已然为正,故为2

    总结:正负相换。

    六、按位右移>> : 排除符号位,二进制数整体向右移动。

    7 >> 2 => 0111 => 0001 = 1 // 这里向右移动了2位,最低位的两个1被抹去。

    七、按位左移<< : 与上同理。
    7 << 2 => 0111 => 011100 = 28 // 这里向右移动了2位,最低位的两个1被抹去。
    总结:右移两位等于除了2的二次方,7/4 = 1 在整数除法中则看成是被舍掉了小数部分。左移就是剩以2的二次方,PHP没有无符号右移运算符>>>

  • 相关阅读:
    GIS开发站点收藏
    读取Excel中的数据到DataSet
    SPSS统计功能与模块对照表
    相关性分析主要源码
    Matlab典型论坛
    EasyUI入门视频教程
    利用EF ORM Mysql实体运行程序出错解决方案
    小议
    六、 从Controller中访问模板数据(ASP.NET MVC5 系列)
    五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
  • 原文地址:https://www.cnblogs.com/zbseoag/p/2964758.html
Copyright © 2020-2023  润新知