逻辑运算符和位运算符

逻辑运算符

逻辑运算符顾名思义就是进行逻辑运算的,总共有三个逻辑运算符。

  • &&(与)逻辑与运算:比较对象两者都为真时结果为真
  • ||(或) 逻辑或运算:比较对象两者只要有一个为真其结果为真
  • ! (非) 逻辑非运算:结果是比较对象的反向及比较对象是真结果为假。
public class OperateTest {
    public static void main(String[] args) {
        boolean a=true;
        boolean b=false;
        boolean c=true;
        System.out.println("a&&b的结果:"+ (a&&b));
        System.out.println("a||b的结果:"+ (a||b));
        System.out.println("a&&c的结果:"+ (a&&c));
        System.out.println("a||c的结果:"+ (a||c));
        System.out.println("!c的结果:"+ (!c));
    }
}
a&&b的结果:false
a||b的结果:true
a&&c的结果:true
a||c的结果:true
!c的结果:false

&& 与||又称之为短路运算符,意思就是当判断第一个比较对象不符合时,就直接输出结果,就不在对第二个比较对象进行计算比较。

		int d=5;
        boolean e=(d>5)&&(++d>5);
        System.out.println(e);
        System.out.println(d);
        boolean f=(d>=5)&&(++d>5);
        System.out.println(f);
        System.out.println(d);
        
false
5
true
6

位运算符

在计算机中数据都是以二进制的形式进行存储的,而位运算就是直接对存储在内存中的数据的二进位进行操作,因此,位运算的执行效率特别高。

位运算是针对二进制的运算,他将每一个二进制作为布尔值(1和0),分别对每一个二进制进行布尔运算。

  • & (逻辑与) :只有两个布尔值都为1时,结果才是1。 0001&0010=0000 0011&1010=0010
  • |(逻辑或):只有两个布尔值都为0时,结果才是0。 0001&0010=0011 0011&1010=1010
  • ^(逻辑异或):两个布尔值相同为1相异为0。 0001&0010=1100 0011&1010=0100
  • ~(逻辑非):就是0变1,1变0。 0=1,1=0
  • << (左移):所有二进制向左移动若干位,高位丢弃,低位补0 0001<<2 0100 1<<2=4
  • (>>)(右移):所有二进制向右移动若干位,底位丢弃,高位补符号位数字 0001<<2 0100 1<<2=4

逻辑非

计算机并不直接存储二进制源码,而是二进制的补码。正数的补码就是源码 如:8 的二进制源码 0000 1000补码也是0000 1000 。但是负数的补码等于 源码(-8 源码10001000)的符号位不变(二进制中的最高位为符号位,1表示负数,0表示正数),其他取反然后加1即-8的补码为(11110111+1)=11111000 负数二进制的源码转补码符号位不变其他取反然后加1,相反负数的二进制补码转源码为先减1然后符号位不变其他取反

​ ~8=-9; ~-8=7

源码 0000 1000 源码 1000 1000

补码 0000 1000 反码 1111 0111

取反 1111 0111 补码 1111 1000

符号位为1 认定为负数 取反 0000 0111

转源码先减1 1111 0110 符号位为0 认定正数

源码 10001001 源码 0000 0111

值为 -(20+23)=-9 值为 20+21+2^2=7

左移和右移

溢出: 当补码算数左移时,若符号位和最高位不同时,则会发生溢出。

左移相当于真值乘以2,而最高数位如果与符号位不同的话,其真值必超过最大表示数值的一半当再发生位移是必超出其取值范围。

针对byte,short,char类型位移是,会先将数据类型装换成int,然后进行位移。

左移: 10<<2 10是正数源码和补码一样 0000 1010 左移高位舍弃低位补0 0010 1000 值为40 -10<<2 -10的源码是 1000 1010 补码是反码加1 1111 0110 左移后 1101 1000 源码是减1取反 1010 1000 值为 -40

**结论:**在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

右移: 10>>2 10是正数源码和补码一样 0000 1010 右移低位舍弃,高位补符号位数字 0000 0010 其值为 2

-10>>2 -10的源码是 1000 1010 补码是反码加1 1111 0110 右移之后1111 1101 源码是减1取反 1000 0011

值为 -3

**结论:**算术右移的结果等于原数除以2的n次幂再向下取整。负数不断进行算术右移,最终变为 − 1, 而非负数最终变为 0。

>>>(无符号右位移运算符)

>>>把操作数的二进制码右位移指定位数,左边空出来的位以0填充。无符号位右移结果总是一个正数。

对于正数来说和带符号右移>>相同,
对于负数来说不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值