位运算符

位运算符的本质是通过转换为二进制后进行位的操作的计算方式

位运算符有 7 个,分为两类:

  • 逻辑位运算符:位与(&)、位或(|)、位异或(^)、非位(~)
  • 移位运算符:左移(<<)、右移(>>)、无符号右移(>>>)

移位运算符:

左移、右移,不与正负号有关

无符号运算符,与正负号有关

1、左移 <<

  总结:左移的结果表现为:x << y  ===  x * 2^y  

  例:5 << 1

  第一步:转码,将 5 转换为二进制数   101

  第二步:补码,补齐32位二进制数    0000 0000 0000 0000 0000 0000 0000 0101

  第三步:左移,左移 1 位,末位数补0    0000 0000 0000 0000 0000 0000 0000 1010

  第四步:转为十进制数,取得结果, 10

  例:-5 << 1

  取得结果为 -10

2、右移 >>

  总结:右移到结果表现为:x >> y  ===  (x / (2^y))的整数部分

  偶数运算

    例:6 >> 1

    第一步:转码,将 6 转换为二进制数   110

    第二步:补码,补齐32位二进制数    0000 0000 0000 0000 0000 0000 0000 0110

    第三步:左移,左移 1 位,末位数补0    0000 0000 0000 0000 0000 0000 0000 0011

    第四步:转为十进制数,取得结果, 3

    例:-6 >> 1

    取得结果为 -3

  奇数运算

    例:5 >> 1

    第一步:转码,将 5 转换为二进制数   101

    第二步:补码,补齐32位二进制数    0000 0000 0000 0000 0000 0000 0000 0101

    第三步:左移,左移 1 位,末位数补0    0000 0000 0000 0000 0000 0000 0000 0010

    第四步:转为十进制数,取得结果, 2

3、无符号右移 >>>

  名字虽然为无符号右移,实际上是带符号右移

  正数运算

  与 右移运算 >> 相同

  负数运算

    例:-5 >>> 3

    第一步:转码,将 5 转换为二进制数   101

    第二步:补码,补齐32位二进制数,正数首位为0,负数首位为 1    1000 0000 0000 0000 0000 0000 0000 0101

    第三步:反码,将二进制数反转,符号位不变,即 0 -> 1,1 -> 0   1111 1111 1111 1111 1111 1111 1111 1010

    第四步:右移 3 位  0001 1111 1111 1111 1111 1111 1111 1111

    第五步:取得十进制数,536870911

 

逻辑位运算符:位与(&)、位或(|)、位异或(^)、取非(~)

  在位运算中,二进制数 1 表示 true,0 表示 false

  位与(&):对两个数的二进制数,逐位比较,若该位都为真,则该位为真,若有假,则为假

    例 :6 & 5

 

      6 --> 1    1    0

      5 --> 1    0    1

     结果:       1    0    0   -->    4

  

  位或( | ):逐位比较,若该位有真,则该位为真,若都为假,则为假  

   例 :6 & 5

      6 --> 1    1    0

      5 --> 1    0    1

     结果:       1    1     1   -->    7

  位异或(^): 逐位比较,若该位 同为真 或 同为假,则为假,反之为真

   例 :6 & 5

      6 --> 1    1    0

      5 --> 1    0    1

     结果:       0    1     1   -->    3

  ~:取非

    将正数的原码转换为补码(都是它的二进制啦)
    对补码按位取反 (注意二进制第一个符号位,原本是0,代表正数)
    正数的补码按位取反后,将补码转换为原码(转换规则也是非符号位的按位取反加1)
    将原码转换对应进制输出(10进制)

   例:~6

    负数的原码转补码,补码转原码都是按位取反再 +1  

    第一步:6的源码为  0000 0110,正数的源码与补码一致,补码:0000 0110

    第二步:对补码按位取反:1111 1001

    第三步:转换为原码输出:1000 0111    -->     -7

  例:~(-6)

    原:1000 0110

    补:1111 1010

   取反:0000 0101

  转原码:0000 0101    -->    5

 

posted @ 2023-03-02 16:01  萧一下  阅读(251)  评论(0编辑  收藏  举报