2018-02-08 第3章 运算符

运算符

Java面向对象程序设计(第2版) 摘抄

整型数据在内存中以二进制的形式表示,比如一个int类型变量在内存中占4个字节,共占32位。int型整数的7的二进制表示为:
00000000 00000000 00000000 00000111
左边最高位是符号位,最高位是0表示是正数,最高位是1表示是负数。负数采用补码表示。比如,-8的二进制表示:
11111111 11111111 11111111 11111000
这样就可以对两位整型数据实施位运算,即对两个整形数据对应的位进行运算得到一个新的整数型数据。

另外注
百度百科查到关于补码的特征描述
1.一个负整数(或原码)与其补数(或补码)相加,和为摸
2.对一个整数的补码再求补码,等于该整数自身
3.补码的正零与负零表示的方法相同
再注: 关于原码,反码,补码运算的个人理解

  • 原码:就是整数对应二进制位的01情况
  • 反码:1.正数的反码与其原码相同。2.负数的反码除去最高位的符号位不做变化,其余各位求原码的相反数,即原码某一位是 0 则反码的相应位就是 1。
  • 补码:1.正数的反码与其原码相同。2.负数的补码等于相应反码的最后一位+1。
  • 例如:
  • +7 的原码是 00000000 00000000 00000111
  • +7 的反码是 00000000 00000000 00000111
  • +7 的补码是 00000000 00000000 00000111
  • -7 的原码是 10000000 00000000 00000111
  • -7 的反码是 11111111 11111111 11111000
  • -7 的补码是 11111111 11111111 11111001
运算符
  • “按位与”运算符 &
  • “按位或”运算符 |
  • “按位非”运算符 ~
  • “按位异或”运算符 ^
    注1:“按位非”是单目运算,求的是其实是一个整数的所有位的相反
    举例:
  • int a = ~1; 则运算结果是 a == -2。
    推导过程:
    1的补码等于1的原码,即1的补码是 00000000 00000000 00000001
    1的补码的所有位相反(补码的反码)是 11111111 11111111 11111110
    用以上所求码作为补码,推到得此补码对应整数的反码是 11111111 11111111 11111101
    再用上一行所求反码求原码 得原码 10000000 00000000 00000010
    可知上一行原码对应的整数是 -2 即最后a的值,推导结束

注2:“按位异或”是双目运算,求的是两个整数对应位是否同号,同号的话为 0 ,不同号的话为 1
举例:

  • int a = 1^2;则运算结果是 a == 3。
    推导过程:
    1的补码是 00000000 00000000 00000000 00000001
    2的补码是 00000000 00000000 00000000 00000010
    经过“按位异或”运算后得到码 00000000 00000000 00000000 00000011
    上一行所得的码是3对应的补码

  • int b = (-1)^(-2); 则运算结果是 b = 1。
    推导过程:
    -1的补码是 11111111 11111111 11111111 11111111
    -2的补码是 11111111 11111111 11111111 11111110
    经过“按位异或”运算后得到码 00000000 00000000 00000000 00000001
    上一行所得的码是1对应的补码

instanceof运算符

instanceof运算符是二目运算符,左侧是对象,右侧是类。即 object instanceof Class 如果对象(object)是类(Class)或者是类的子类所创建的对象,则返回 true,否则返回 false

推荐阅读更多精彩内容