美文网首页
位运算 - 基础

位运算 - 基础

作者: BruceOuyang | 来源:发表于2022-05-03 17:52 被阅读0次

    一、位逻辑运算

    1、与运算: a & b

    与运算,对应位都为 1,结果为 1,否则为 0
    相当于一般逻辑运算符 and ,把 1 视为 true, 把 0 视为 false

    12 & 8 = 8
    
          0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
     &    0000 0000 0000 0000 0000 0000 0000 1000      -> 十进制 8 的二进制形式
    ———————————————————————————————————————————————
          0000 0000 0000 0000 0000 0000 0000 1000
    

    2、或运算: a | b

    或运算,对应位含有 1,结果为 1,否则为 0
    相当于一般逻辑运算符 or ,把 1 视为 true, 把 0 视为 false

    12 | 8 = 12
    
          0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
     |    0000 0000 0000 0000 0000 0000 0000 1000      -> 十进制 8 的二进制形式
    ———————————————————————————————————————————————
          0000 0000 0000 0000 0000 0000 0000 1100
    

    3、取反运算: ~a

    取反运算,对应位为 1,结果为 0,否则为 1
    相当于一般逻辑运算符 ! ,把 1 视为 true, 把 0 视为 false

    ~12 = -13
    
     ~    0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
    ———————————————————————————————————————————————
          1111 1111 1111 1111 1111 1111 1111 0011
    

    4、异或运算: a ^ b

    异或运算,对应位值相同,结果为 0,否则为 1
    相当于一般逻辑运算符 equals ,把 1 视为 true, 把 0 视为 false

    12 ^ 8 = 4
    
          0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
     ^    0000 0000 0000 0000 0000 0000 0000 1000      -> 十进制 8 的二进制形式
    ———————————————————————————————————————————————
          0000 0000 0000 0000 0000 0000 0000 0100
    

    二、位移运算

    1、左移运算: a << n

    左移运算,对应位整体向左移动 n 位,低位补 0, 高位溢出的舍去
    相当于乘以 2 的 n 次方

    12 << 2 = 48
    
     << 2     0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
    ———————————————————————————————————————————————————————
              0000 0000 0000 0000 0000 0000 0011 0000
    

    2、右移运算: a >> n

    正数右移运算,对应位整体向右移动 n 位,高位补 0, 低位溢出的舍去
    相当于除以 2 的 n 次方

    12 >> 2 = 3
    
     >> 2     0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
    ———————————————————————————————————————————————————————
              0000 0000 0000 0000 0000 0000 0000 0011
    

    负数右移运算,对应位整体向右移动 n 位,高位补 1, 低位溢出的舍去

    -12 >> 2 = -3
    
     >> 2     1111 1111 1111 1111 1111 1111 1111 0011      -> 十进制 -12 的二进制形式
    ———————————————————————————————————————————————————————
              1111 1111 1111 1111 1111 1111 1111 1100
    

    3、无符号右移运算: a >>> n

    无符号右移运算,对应位整体向右移动 n 位,高位补 0, 低位溢出的舍去
    相当于除以 2 的 n 次方

    12 >>> 2 = 3
    
     >>> 2    0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
    ———————————————————————————————————————————————————————
              0000 0000 0000 0000 0000 0000 0000 0011
    
    
    -12 >>> 2 = 1073741821
    
     >>> 2    1111 1111 1111 1111 1111 1111 1111 0011      -> 十进制 -12 的二进制形式
    ———————————————————————————————————————————————————————
              0011 1111 1111 1111 1111 1111 1111 1100
    

    三、极端位移测试

    1、左移运算: a << n, n > 32

    左移运算,对应位整体向左移动 n 位,低位补 0, 高位溢出的舍去
    若 n > 32, 相当于乘以 2 的 n % 32 次方

    12 << 27 = 1610612736
    12 << 30 = 0
    12 << 32 = 12
    12 << 33 = 24
    12 << 64 = 12
    12 << 96 = 12
              0000 0000 0000 0000 0000 0000 0000 1100      -> 十进制 12 的二进制形式
    

    四、低精度整型位移运算

    低精度整数做位移操作会有溢出,因此低精度的数据类型不适合用于位运算

    1、byte 无符号右移

    byte -32 >>> 1 = -16
    

    2、short 无符号右移

    short -128 >>> 1 = -64
    

    附、基本数据类型

    基本类型 字节数 位数
    byte 1byte 8bit
    short 2byte 16bit
    int 4byte 32bit
    long 8byte 64bit
    float 4byte 32bit
    double 8byte 64bit
    char 2byte 16bit

    对于所有的位运算,操作的都是二进制的数据,如果数据为其他进制,会先转换为二进制再做计算

    原文来自我的github仓库:https://github.com/BruceOuyang/issuelist/issues/114

    已更新到我的个人站点:https://bruce.bugmakers.club

    相关文章

      网友评论

          本文标题:位运算 - 基础

          本文链接:https://www.haomeiwen.com/subject/knhiyrtx.html