位运算与逻辑运算及其区别(java)

一、位运算

1、定义:程序中的所有数在计算机内存中都是以二进制补码的形式存储的。位运算就是直接对整数在内存中的二进制补码进行操作。
2、分类:

符号 名称及运算规则
& 按位与:全1为1,否则为0
按位或:全0为0,否则为1
^ 按位异或:相同为0,否则为1
~ 按位取反:0变为1,1变为0
>> 右移:补码向右移动相应位数,负数高位补1,正数补0
<< 左移:向左移动相应位数,低位补0
>>> 无符号右移:向右移动相应位数,高位补0
//按位与
    final byte a = 4;//二进制补码为:0000 0100
    final byte b = 5;//二进制补码为:0000 0101
    byte c = a & b;//运算后的二进制补码为:0000 0100
    System.out.print(c);//输出结果为4

    final byte a = -4;//二进制补码为:1111 1100
    final byte b = 5;//二进制补码为:0000 0101
    byte c = a & b;//运算后的二进制补码为:0000 0100
    System.out.print(c);//输出结果为4

//按位或(符号为|)
    final byte a = -4;//二进制补码为:1111 1100
    final byte b = 5;//二进制补码为:0000 0101
    byte c = a | b;//运算后的二进制补码为:1111 1101
    System.out.print(c);//输出结果为-3

//按位异或
    final byte a = -4;//二进制补码为:1111 1100
    final byte b = 5;//二进制补码为:0000 0101
    byte c = a ^ b;//运算后的二进制补码为:1111 1001
    System.out.print(c);//输出结果为-7
    
//按位非
    final byte a = -4;//二进制补码为:1111 1100
    byte c = ~a;//运算后的二进制补码为:0000 0011
    System.out.print(c);//输出结果为3


//右移
    final byte a = -4;//二进制补码为:1111 1100
    byte c = a>>2;//运算后的二进制补码为:1111 1111
    System.out.print(c);//输出结果为-1(相当于除以2^2)

//无符号右移
    final int a = -4;//二进制补码为:1111 1111 1111 1111 1111 1111 1111 1100
    int c = a>>>2;//运算后结果为:0011 1111 1111 1111 1111 1111 1111 1111
    System.out.print(c);//输出结果为1073741823

//左移
    final byte a = -4;//二进制补码为:1111 1100
    byte c = a<<2;//运算后结果为:1111 0000
    System.out.print(c);//输出结果为-16(相当于乘2^2)

二、逻辑运算

1、定义:逻辑运算又称布尔运算。java中逻辑运算符的俩边应为Boolean类型。
2、分类:

符号 名称及其运算规则
&& 逻辑与:全真为真,否则为假
逻辑或:全假为假,否则为真
逻辑非:真变为假,假变为真
//逻辑与
    if(false && true){
		System.out.print("if中的运算结果为true");//if中运算结果为false,因此此处不执行
	}else{
		System.out.print("if中的运算结果为false");//if中运算结果为false,因此此执行
	}

//逻辑或
    if(false || true){
		System.out.print("if中的运算结果为true");//if中运算结果为true,因此此处执行
	}else{
		System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
	}

//逻辑或的短路
    int a = 10, b = 10;
    if((a=0)==0 || (b=0)==0){
		System.out.print(b);//if中运算结果为true,因此此处执行,并且(a=0)==0为true,所以(b=0)==0)不再执行
	}else{
		System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
	}


//逻辑非
     if(!false){
		System.out.print("if中的运算结果为true");//if中运算结果为true,因此此处执行
	}else{
		System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
	}

逻辑运算与位运算的区别:

1、运算对象的不同 :逻辑运算只针对Boolean类型的数据 ,位运算还可以对二进制补码进行运算。
2、逻辑或存在短路情况,按位或则不存在。
3、按位取反~与逻辑非!为单目运算符,其余的为双目运算符他们的优先级规则为! ~ << >> & ^ | && || (其他运算符优先级可参照百度)
4、按位异或可以实现不声明第三变量的情况下的俩个数字的交换

    int a = 1, b = 2;
    a = a ^ b;
    b = a ^ b;//相当于a^b^b结果为a
    a = a ^ b;//相当于a^b^a结果为b
    System.out.print("a:" + a + ",b:" + b);//输出结果为:a:2,b:1

写在最后:java小白一枚,有错误或修改意见请大神指出!!!感激不尽!!!

发布了10 篇原创文章 · 获赞 2 · 访问量 168

猜你喜欢

转载自blog.csdn.net/weixin_44785966/article/details/102871110