java常见的各种运算符使用(~、|、^、&、&&、||、instanceof、?:)与优先级

本文深入解析Java中的各类运算符,包括优先级、不常见的运算符如instanceof、按位非、移位运算符等的使用,以及按位与、异或、或、逻辑与、或运算符的区别,同时介绍了三目运算符的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数字在计算机中是以补码的形式存在

0000 0000 0000 0010		2 的原码
1000 0000 0000 0010		-2 的原码
1111 1111 1111 1101		-2 的反码
1111 1111 1111 1110		-2 的补码
不信的话可以打印System.out.println(Integer.toBinaryString(-2));

java运算符和它的优先级

优先级运算符
1级分割符([]、()、; . ,)
2级对象归类运算符(instanceof)、逻辑非(!)、自增运算符(++)、自减运算符(–)、按位非运算符(~)
3级算术乘除运算符(*、/、%)
4级算术加减运算符(+、-)
5级移位运算符(>>、 >>>、 <<)
6级大小关系运算符(> 、>=、<、<=)
7级相等关系运算符(==、!=)
8级按位与运算符(&)
9级按位异或运算符(^)
10级按位或运算符
11级逻辑与运算符(&&)
12级逻辑或运算符
13级三目运算符(? : )
14级赋值运算符(!=、=、+=、-=等)

不常见运算符的使用

instanceof是对象归类运算符,左边是对象名,右边是类名

例如:a是一个对象名, A是一个类的名字

if(a instanceof A)	{
    System.out.println("t是instanceOfDemo的实例");
   }

~按位非运算符

对二进制进行运算(正数符号位位0,负数符号位为1)

原码:

  • 正数的原码是自己的二进制
  • 负数的原码就是正数的二进制,然后最高为变为1

反码:

  • 正数的反码就是自己的原码
  • 负数的反码,就是除了最高位的符号位之外,全部取反

补码:

  • 正数的补码就是自己的原码
  • 负数的补码就是反码 + 1

结论:

  • 正数的原码、反码、补码相同
/*
 * 按位取反运算符是将内存中的补码按位取反(包括符号位)
 * ~5的值-6
 * 正数的原码、反码、补码都一样
 * 5的二进制为(即源码、反码、补码):		0000 0000 0000 0000 0000 0000 0000 0101
 * ~5运算:
 * 取反:								1111 1111 1111 1111 1111 1111 1111 1010  (这是负数的补码) 就是 -6 的二进制码
 * 使用-6的二进制验证与上述补码结果一样	
 * Integer z = -6;
 * System.out.println(z.toBinaryString(z));
 * 11111111111111111111111111111010
 * 结论: 负数的二进制就是补码
 */

 /* 负数与正数不一样 
 * -11的原码为:      1000 0000 0000 0000 0000 0000 0000 1011
 * ~-11运算:
 * 取反(: 最高位为符号位不变  0为正数	1为负数)
 * 取反结果为:		1111 1111 1111 1111 1111 1111 0000 0100
 * 负数的反码+1是补码
 * 补码: 			1111 1111 1111 1111 1111 1111 1111 0101
 * Integer t = -11;
 * System.out.println(t.toBinaryString(t));
 * -11的二进制为:  	1111 1111 1111 1111 1111 1111 1111 0101		
 * 结论: 负数的二进制就是补码
 */
Integer a =5;
System.out.println(a.toBinaryString(a));
System.out.println(~5);
Integer z = -6;
System.out.println(z.toBinaryString(z));

Integer t = -11;
System.out.println(t.toBinaryString(t));

>>、>>>、<<移位运算符

对二进制进行运算(正数符号位位0,负数符号位为1)
  • 左移((<<) 带符号左移,正数左移最高位(符号位)补0,负数左移最高位(符号位)补1,符号位是左边第一位 ,(高位)左边舍弃,(低位)左边补0,符号位除外,结果相当于乘2
  • 右移(>>) 带符号右移。正数右移高位(符号位)补0,负数右移高位(符号位)补1,符号位是左边第一位, (高位)左边补0,(低位)右边舍弃,符号位除外,结果相当于乘2
  • 右移(>>>)无符号右移, (高位)左边补0,(低位)右边舍弃
/*
* 移位运算符
* >>:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。符号位不变。
* >>>:二进制右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 
* -8 >> 2
* 1111 1111 1111 1000
* 1000 0000 0000 0010
* 0000 0000 0000 1000
* 0000 0000 0000 0100
* 2 转换为二进制数为:         0000 0000 0000 0010
* 全部位右移 1 位后为:    	0000 0000 0000 0001 (右边的溢出,不要了,左边补上一个0)
* 转化为十进制为 1 。
*/
System.out.println(2>>1);			//右移运算符  低位溢出,高位补0
System.out.println(8<<2); 			//左移运算符  高位溢出,低位补0
System.out.println(8>>>1);			//1000 

&、^、| 按位运算符

对二进制进行运算
  • |(一个以上为1,就为1,否则为0)
  • 1010
  • 1000
  • 1010
  • ^(同位相同为0,否则为1)
  • 1010
  • 1000
  • 1010
  • &(同为1为1,否则为0)
  • 1010
  • 1000
  • 1000
/*
* 位运算符二进制位运算原理
*/
Integer a = 10;
Integer b =8;
System.out.println(a | b);		//1010有1个以上为1,否则为0	0+2+0+8
System.out.println(a ^ b);		//0010同位相同 ,为0, 否则为1	0+2+0+0
System.out.println(a & b);		//1000同为1,为1,否则为0		0+0+0+8

&与&&、|与||的区别

  • a && b //a是false, 不会继续判断b的结果
  • a & b //a是false,也会继续判断b的结果
  • a || b //a是true,不会继续判断b的结果
  • a | b //a是true,也会继续判断b的结果

? : 三目运算符

  • 表达式 : 返回值1:返回值2
  • 表达式为true,返回值1
  • 表达式为false,返回值2
/*
a>b ? a : b   true 就输出a的值5, false就输出b的值6
*/
public static void demo1() {
		int a = 5;
		int b = 6;
		System.out.println(a>b ? a : b);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值