Java 运算符

608 阅读7分钟

自我感受

最近在找工作,有一点感受是基础很重要,很重要,能不能走得远,能否走多远,还是在于地基是否稳固,当然还有思维逻辑,知识体系,交流沟通(以后再聊),于是重新拾起了Java基础,纪录一下,巩固一下。

1 原码、反码、 补码

数据类型

  • 在Java虚拟机中整数有byte、short、int、long四种分别表示 8位、16位、32位、64位有符号整数

机器数

  • 一个数在计算机中的二进制表示, 机器数是带符号的,用一个数的最高位存放符号, 正数为0, 负数为1。

比如,十进制中的数3 ,转换成二进制就是00000011,如果是 -3 ,就是 10000011

真值

  • 第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)

1.1 原码

  • 原码就是符号位加上数字的二进制表示,第一位表示符号 (0正数 1负数)

    +7的原码为: 00000111

    -7的原码为: 10000111

1.2 反码

1.3 补码

  • 在计算机中没有原码,反码的存在,只有补码,补码参与实际运算

  • 补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,去到反码然后加1(反码加1就是补码)

    +7的补码为: 00000111

    -7的补码为:11111001

  • -10求补码步骤(int)

    -10的原码: 10000000 00000000 00000000 00001010

    -10的反码: 11111111 11111111 11111111 11110101

    -10的补码: 11111111 11111111 11111111 11110110

1.4 计算机中补码参与实际运算

 1用原码计算10-10
         0000 1010   (10的原码)
    +    1000 1010   (-10的原码)
         1001 0100   (结果为:-20
 2>使用反码计算10-10
       0000 1010   (10的反码)
    +  1111 0101   (-10的反码)
       1111 1111   (结果为:-0)   
3>使用补码计算10-10
      0000 1010    (10的补码)
   +  1111  0110   (-10的补码)
    1 0000 0000    (结果为:0)      

1.5 总结

  • 正数:它的原码、反码、补码相同
  • 负数:反码 符号位不变化,其余位数取反,补码 符号位不变化其余各位原码取反(反码)+1==(反码+1)

2 逻辑运算符

"<<" 表示左移,不分正负数,低位补0

正数:r = 20 << 2
  20的二进制补码:0001 0100
  向左移动两位后:0101 0000
         结果:r = 80
负数:r = -20 << 2
  -20 的二进制原码 :1001 0100
  -20 的二进制反码 :1110 1011
  -20 的二进制补码 :1110 1100
  左移两位后的补码:1011 0000
        反码:1010 1111
        原码:1101 0000 
        结果:r = -80

">>" 表示右移,如果该数为正,则高位补0,若为负数,则高位补1

正数:r = 20 >> 2
  20的二进制补码:0001 0100
  向右移动两位后:0000 0101
       结果:r = 5
负数:r = -20 >> 2
  -20 的二进制原码 :1001 0100
  -20 的二进制反码 :1110 1011
  -20 的二进制补码 :1110 1100 
  右移两位后的补码:1111 1011 
        反码:1111 1010
        原码:1000 0101

">>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0"

正数: r = 20 >>> 2
    的结果与 r = 20 >> 2 相同
负数: r = -20 >>> 2
注:以下数据类型默认为int 32
  -20:原码:10000000 00000000 00000000 00010100
    反码:11111111  11111111   11111111   11101011
    补码:11111111  11111111   11111111   11101100
    右移:00111111  11111111   11111111   11111011
    结果:r = 1073741819

"^” 位异或运算

  • 运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
          8^11
      0000 1000     
   +  0000 1011    
      0000 0011    (结果为:3

"&" 位与运算符

  • 运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
         =   8&11
        0000 1000     
   +    0000 1011    
        0000 1000    (结果为:8)  

"|" 位或运算符

  • 运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
            8|11
        0000 1000     
   +    0000 1011    
        0000 1011    (结果为:11

"~" 位非运算符

                ~37
  补码            0010 0101
  取反,高位变      1101 1010    
  取反,高位不变    1010 0101
  +1              1010 0110  (值:-38

本文使用 mdnice 排版