短路原则

  • JAVA 中的逻辑运算符
    图来自菜鸟教程
  • Java短路输出 java短路原则_反码

  • 短路原则
    即是在Java中如果执行该逻辑判断时能够判断整条语句的正确了那就不执行后面的语句了
int index=5;
		System.out.println((5==5)||(++index==5));
		System.out.println(index);
		System.out.println((5==6)&&(++index==6));
		System.out.println(index);

输出:

Java短路输出 java短路原则_System_02

位运算

二元操作符:
        左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位异或( ^ )
    一元运算符:
        位非( ~ )

二元运算符即是左右两边都要有  变量(已赋值)/常量

  • 左移(<<)

3<<2

即是指将3转为二进制:

0000 0000 0000 0000 0000 0000 0000 0011

11后左移两位即是1100

0000 0000 0000 0000 0000 0000 0000 1100

转化为十进制为12,(常常感觉就是乘了2的几次方)

  • 右移(<<)

所以如果是7<<2的话,7的二进制是

0000 0000 0000 0000 0000 0000 0000 0111

右移两位(高位补零):

0000 0000 0000 0000 0000 0000 0000 0001

即为1

  • 无符号右移(>>>)
在我们的计算机中,机器数的二进制序列中,最高位代表的是正负,0则正,1则负

  所以对于int型,其占有四个字节,32位,所以其大小范围为[-2^31^,2^31^-1]

在此先来回顾一下我们学到的原码,反码,补码

正数的原,反,补是一样的,下面只说负数

  • 负数的原码:如-7,在一个字节表示下为

1000 0111


  • 反码是在原码的基础上符号位不变,其余位取反
    即在一个字节表示下,-7的反码为:

1111 1000


  • 反码是在补码的基础上加1
    即在一个字节表示下,-7的补码为:

1111 1001

  • 所以无符号右移(>>>)是什么意思呢?
    从无符号上即可以认为该主要针对负数,对于正数无符号与有符号右移是一样的,而负数就不一样了。
    例如在Java中,将-5(默认为int型)转换为二进制为:

1111 1111 1111 1111 1111 1111 1111 1011

System.out.println(Integer.toBinaryString(-5));

输出:

Java短路输出 java短路原则_赋值_03

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

得到了-5在计算中的二进制码之后,无符号后移三位即是,前面补“0”,所以-5>>>3

即得到二进制序列为:

0001 1111 1111 1111 1111 1111 1111 1111

转为十进制为:536870911

System.out.println(Integer.toBinaryString(-5));
System.out.println(Integer.toBinaryString(-5>>>3));
System.out.println(-5>>>3);
System.out.println(-5>>3);

输出:

Java短路输出 java短路原则_System_04

  • 位与(&)

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即是离散数学中同为真才为真

  • 不多说,上实测例子:
System.out.printf("-1的二进制码为:%s%n",Integer.toBinaryString(-1));
	System.out.printf("9的二进制码为:%s%n",Integer.toBinaryString(9));
	System.out.printf("12的二进制码为:%s%n",Integer.toBinaryString(12));
	System.out.println("9&-1的值为"+(9&-1));
	System.out.println("9&12的值为"+(9&12));
	System.out.println("9&0的值为"+(9&0));
	System.out.println("9&1的值为"+(9&1));

输出:

Java短路输出 java短路原则_赋值_05

同理其他三个也是一样,这里就不一一说明了,结合布尔运算就很好记住了

  • 位或( | )

有“ 1”得“1”

  • 位移或( ^ )

不同为“1”

  • 位非( ~ )

取反就是

测试
System.out.println(~9==(-10));//输出true

位运算符的组合

如:&= 按位与赋值

|= 按位或赋值

^= 按位非赋值

>>= 右移赋值

>>>= 无符号右移赋值

<<= 赋值左移