Java基础语法之易错点(三)

下面给大家讲一下Java中容易错误理解的几种运算符——位运算符,逻辑运算符,还有instanceof运算符。

位运算符

位运算符作用在所有的位上,并且按位运算。

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符

描述

例子

&

如果相对应位都是1,则结果为1,否则为0

(A&B),得到12,即0000 1100

|

如果相对应位都是0,则结果为0,否则为1

(A|B),得到61,即0011 1101

^

如果相对应 位值相同,则结果为0,否则为1

(A^B),得到49,即0011 0001

~

按位取反运算符转操作数的每一位,即0变成1,1变成0

(~A)得到-61,即1100 0011

<<

按位左移运算符。左操作数按位左移右操作数指定的位数

A<<2得到240,即1111 0000

>>

按位右移运算符。左操作数按位右移右操作数指定的位数

A>>2得到15,即 1111

>>>

按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充

A>>>2得到15,即0000 1111

【注】表格中按位取反,即~,所得结果不是特别好理解,在此详细说明:

首先,请先搞懂“取反”,“反码”,“按位取反(~)”

取反:0变1,1变0

反码:正数的反码是其本身,对于负数其符号位不变,其他各位取反(0变1,1变0)

按位取反(~):将是下面要讨论的

我们要知道以下几个知识点:

  • 二进制数在内存中是以补码的形式存放的;
  • 正数的补码、反码都是其本身;

【举例说明】

正数9:

原码为: 0000 1001

补码为: 0000 1001

反码为: 0000 1001

再例如: -2

求原码: 1111 0010 (前面4个1表示符号位)

求反码: 1111 1101 (符号位不变,其余各位求反)

求补码: 1111 1110 (符号位不变,末位+1)

所以-2在内存中存放为: 1111 1110

继续我们上面表格中的例子说明:

A=60,

(1)转二进制:0011 1100

(2)计算补码:0011 1100

(3)按位取反:1100 0011

(4)减1得反码:1100 0010

(5)取反得原码(首位代表符号位,不变):1011 1101

即得到-61

最后一个有趣的事实是:

1. 所有正整数的按位取反是其本身+1的负数

2. 所有负整数的按位取反是其本身+1的绝对值

3. 零的按位取反是 -1(0在数学界既不是正数也不是负数) 

 

逻辑运算符

对于三种逻辑运算符,大家大概都比较熟悉了,它们分别是与(“&&”),或(“||”),非(“!”)。

其中需要特别注意的是,“与”和“或”都属于短路逻辑运算符。

【举例】

public class LuoJi{
    public static void main(String[] args){
        int a = 5;//定义一个变量;
        boolean b = (a<4)&&(a++<10);
        System.out.println("使用短路逻辑运算符的结果为"+b);
        System.out.println("a的结果为"+a);
    }
}

运行结果为:


使用短路逻辑运算符的结果为false a的结果为5


原因:该程序使用到了短路逻辑运算符(&&),首先判断 a<4 的结果为 false,则 b 的结果必定是 false,所以不再执行第二个操作 a++<10 的判断,所以 a 的值为 5。

同理,逻辑“或”也为短路运算符。

 

instanceof运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

instanceof运算符使用格式如下:

(Object reference variable ) instanceof (class/interface type)

如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真;或者,如果被比较的对象兼容于右侧类型,该运算符仍然返回true。

 

Java运算符优先级

最后补充Java运算符的优先级(从上到下优先级越来越低):

类别

操作符

关联性

后缀

()  []  .

从左到右

一元

++  --   +   -   !  ~

从右到左

乘性

*   /   %

从左到右

加性

+   -

从左到右

移位

>>  >>>  <<

从左到右

关系

>>  =   <<  =

从左到右

相等

==   !=

从左到右

按位与

&

从左到右

按位异或

^

从左到右

按位或

|

从左到右

逻辑与

&&

从左到右

逻辑或

||

从左到右

条件

?:

从右到左

赋值

=  +=  -=  *=  /=  %=  >>=  <<=  &=  ^=  |=

从右到左

逗号


从左到右