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运算符的优先级(从上到下优先级越来越低):
类别 | 操作符 | 关联性 |
后缀 | () [] . | 从左到右 |
一元 | ++ -- + - ! ~ | 从右到左 |
乘性 | * / % | 从左到右 |
加性 | + - | 从左到右 |
移位 | >> >>> << | 从左到右 |
关系 | >> = << = | 从左到右 |
相等 | == != | 从左到右 |
按位与 | & | 从左到右 |
按位异或 | ^ | 从左到右 |
按位或 | | | 从左到右 |
逻辑与 | && | 从左到右 |
逻辑或 | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |