Java位运算符

前置知识

  1. 原码、反码、补码
    - 原码:第一位表示符号,其余位表示值。如 2原码:0000 0010;-2原码:1000 0010
    - 反码:正数的反码是原码本身,负数的反码在原码基础上,符号位不变,其他位取反。如:2反码:0000 0010;-2反码:1111 1101
    - 补码:正数的反码是原码本身,负数的补码在原码基础上,符号位不变,其他位取反,最后位+1。如:2补码:0000 0010;-2补码:1111 1110
  2. 计算机中的数字是通过二进制编码的方式进行存储,而负数使用补码表示法进行存储,进行位运算时先运算补码,再转为十进制输出。

说明

  • 概述:位运算符,用来操作变量的二进制位,分为按位运算符& | ^ ~移位运算符 << >> >>>
    • 按位运算符:对二进制位执行布尔代数计算。包含:按位且AND(&)、按位或OR(|)、按位异或XOR(^)、按位非NOT(~)
      • &:两个输入位都是1,则为1,否则为0;
      • |:两个输入位都是0,则为0,否则为1;
      • ^:两个输入位相同为0,不同为1;
        • 特点:交换律A^B^C=A^C^B,结合律A^B^C=A^(B^C),自反性A^0=A,A^A=0
        • 应用场景:1.在不引入第三个变量的情况下,转换两个变量的值;2.找出唯一一个成对的数;3.找出唯一一个落单的数
      • ~:输入位0改为1,1改为0。
    • 移位运算符:对二进制位向左向右移动。包含:左移位(<<)、有符号右移位(>>)、无符号右移位(>>>)
      • <<:将二进制数位整体向左移动N位(低位补0)左移一位相当于乘以2,负数左移等于正数左移乘以-1
      • >>:将二进制数位整体向右移动N位(正数高位补0,负数高位补1)右移一位相当于除以2
      • >>>:将二进制数位整体向右移动N位(正负都高位补0)

示例

  1. 正数(正数的补码等于本身,直接计算即可)
    33&44
        33原码:0010 0001
        44原码:0010 1100 =》0010 0000 =》32
    33|44
        33原码:0010 0001
        44原码:0010 1100 =》0010 1101 =》45
    33^44
        33原码:0010 0001
        44原码:0010 1100 =》0000 1101 =》13
    ~33
        33原码:0010 0001
        33反码:0010 0001
        33补码:0010 0001
        ~33补码:1101 1110
        ~33反码:1101 1101
        ~33原码:1010 0010 =》-34
    33<<2
        33原码:00000000 00100001 =》00000000 10000100(低位补0) =》132
    33>>2
        33原码:00000000 00100001 =》0(00)00000 00001000(有符号高位补0) =》8
    33>>>2
        33原码:00000000 00100001 =》(00)000000 00001000(无符号高位补0) =》8
    
  2. 负数(负数需要先计算补码,再进行位运算)
    -33&44
        -33原码:1010 0001
        -33反码:1101 1110
        -33补码:1101 1111
        44补码:0010 1100 《= 44原码:0010 1100
    =》 -33&44补码:0000 1100(首位为0表示正数,补码=反码=原码)
        -33&44反码:0000 1100
        -33&44原码:0000 1100 =》12
    -33|44
        -33原码:1010 0001
        -33反码:1101 1110
        -33补码:1101 1111
        44补码:0010 1100 《= 44原码:0010 1100
    =》 -33&44补码:1111 1111
        -33&44反码:1111 1110
        -33&44原码:1000 0001 =》-1
    -33^44
        -33原码:1010 0001
        -33反码:1101 1110
        -33补码:1101 1111
        44补码:0010 1100 《= 44原码:0010 1100
    =》 -33^44补码:1111 0011
        -33^44反码:1111 0010
        -33^44原码:1000 1101 =》-13
    ~ -33
        -33原码:1010 0001
        -33反码:1101 1110
        -33补码:1101 1111
    =》 ~-33补码:0010 0000
        ~-33反码:0010 0000
        ~-33原码:0010 0000 =》32
    -33<<2
        -33原码:10000000 00100001
        -33反码:11111111 11011110
        -33补码:11111111 11011111
        左二补码:11111111 011111(00)(左移低位补0)
        左二反码:11111111 01111011
        左二原码:10000000 10000100 =》-132(其实就是 正数移位后*-1)
    -33>>2
        -33原码:10000000 00100001
        -33反码:11111111 11011110
        -33补码:11111111 11011111
        右二补码:1(11)11111 11110111(有符号右移负数高位补1)
        右二反码:11111111 11110110
        右二原码:10000000 00001001 =》-9
    -33>>>2
        -33原码:10000000 00000000 00000000 00100001
        -33反码:11111111 11111111 11111111 11011110
        -33补码:11111111 11111111 11111111 11011111
        右二补码:(00)111111 11111111 11111111 11110111(无符号右移高位补0)
        右二反码:00111111 11111111 11111111 11110111
        右二原码:00111111 11111111 11111111 11110111 =》1073741815
    
posted @ 2023-04-17 10:13  晚秋的风  阅读(70)  评论(0编辑  收藏  举报