Java 运算符
算术运算符
关系运算符
位运算符
| 操作符 | 描述 |
|---|---|
| & | 如果相对应位都是1,则结果为1,否则为0 |
| | | 如果相对应位都是0,则结果为 0,否则为1 |
| ^ | 如果相对应位值相同,则结果为0,否则为1 |
| 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 |
例:
public class Test {
public static void main(String[] args) {
int a = 20;int b = -20; int s = 15;
/* a = 20 = 0001 0100 如果相对应位都是1,则结果为1,否则为0
s = 15 = 0000 1111
a & s = 0000 0100 = 4 */
System.out.println("a & s = " + (a & s) );
/* b = -20 = 1110 1100 负数二进制有 负数的绝对值的反码,再补码 20 = 0001 0100
s = 15 = 0000 1111 上面的0变1,1变0 反码 1110 1011
b & s = 0000 1100 = 12 上面的二进制+1 补码 1110 1100 */
System.out.println("b & s = " + (b & s) );
/* a = 20 = 0001 0100 如果相对应位都是 0,则结果为 0,否则为 1
s = 15 = 0000 1111
a & s = 0001 1111 = 31 */
System.out.println("a | s = " + (a | s) );
/* b = -20 = 1110 1100
s = 15 = 0000 1111
a & s = 1110 1111 = -17 补码前:1110 1110 反码前:0001 0001 = 17 */
System.out.println("a | s = " + (b | s) );
/* a = 20 = 0001 0100 如果相对应位值相同,则结果为0,否则为1
s = 15 = 0000 1111
a & s = 0001 1011 = 27 */
System.out.println("a ^ s = " + (a ^ s) );
/* b = -20 = 1110 1100
s = 15 = 0000 1111
a & s = 1110 0011 = -29 补码前:1110 0010 反码前:0001 1101 = 29 */
System.out.println("b ^ s = " + (b ^ s) );
/* a = 20 = 0001 0100 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 即反码
^a = 1110 1011 = -21 补码前:1110 1010 反码前:0001 0101 = 21 */
System.out.println(" ~a = " + (~a) );
/* b = -20 = 1110 1100
^b = 0001 0011 = 19 */
System.out.println(" ~b = " + (~b) );
/* a = 20 = 0001 0100 按位左移运算符。左操作数按位左移右操作数指定的位数。
a << 2 = 0101 0000 = 80 */
System.out.println("a << 2 = " + (a << 2) );
/* b = -20 = 1110 1100
b << 2 = 1011 0000 = -80 补码前:1010 1111 反码前:0101 0000 = 80 */
System.out.println("b << 2 = " + (b << 2) );
/* a = 20 = 0001 0100 按位右移运算符。左操作数按位右移右操作数指定的位数。
a >> 2 = 0000 0101 = 5 */
System.out.println("a >> 2 = " + (a >> 2) );
/* b = -20 = 1110 1100
b >> 2 = 1111 1011 = -5 补码前:1111 1010 反码前:0000 0101 = 5 */
System.out.println("b >> 2 = " + (b >> 2) );
/* 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
a = 20 = 0001 0100
a >>> 2 = 0000 0101 = 5 */
System.out.println("a >>> 2 = " + (a >>> 2) );
/* b = -20 = 1111 1111 1111 1111 1111 1111 1110 1100 (32位)
b >>> 2 = 0011 1111 1111 1111 1111 1111 1111 1011 = 1073741819
在这里存储二进制的int类型是32位,32位的0,1表示该数是正是负
所以这里 b>>>2 等同于 int类型的最大值 - 2^30 - 2^2 (二进制是从2^0开始的)
System.out.println(Integer.MAX_VALUE - (int) Math.pow(2,30) - (int) Math.pow(2,2));
*/
System.out.println("b >> 2 = " + (b >> 2) );
}
}

逻辑运算符
赋值运算符
三目运算符(?:)
Java运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
(我觉得不用咋记,用着,每次测试运行下,久了都习惯了,大部分顺序就和数学计算差不多)
| 类别 | 操作符 | 关联性 |
|---|---|---|
| 后缀 | () [] . (点操作符) | 左到右 |
| 一元 | expr++ expr-- | 从左到右 |
| 一元 | ++expr --expr + - ~ ! | 从右到左 |
| 乘、除、取余 | * / % | 左到右 |
| 加、减 | + - | 左到右 |
| 移位 | >> >>> << | 左到右 |
| 判断 | > >= < <= == != | 左到右 |
| 按位与 | & | 左到右 |
| 按位异或 | ^ | 左到右 |
| 按位或 | | | 左到右 |
| 逻辑与 | && | 左到右 |
| 逻辑或 | | | | 左到右 |
| 条件 | ?: | 从右到左 |
| 赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
| 逗号 | , | 左到右 |

浙公网安备 33010602011771号