逻辑运算符与位运算符(含案列)

java 同时被 2 个专栏收录
36 篇文章 0 订阅
3 篇文章 0 订阅

逻辑运算符与位运算符

逻辑运算符基本定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUrTHaQJ-1596279041323)(D:\笔记\博客\images\逻辑运算符.png)]

&:两个都为真才真(有一个false就false)

|:有一个真就是真(有一个true就true)

^:一样为false,不同为true

!:真为假,假为真

&&:两个都为真才真(有一个false就false)

||:有一个真就是真(有一个true就true)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmlXn7x5-1596279041337)(D:\笔记\博客\images\逻辑运算符2.png)]

  • &与&&的区别

    • &:&前后都要判断,才得出结果
    • &&:只要&&前面能决定结果,就不执行后一个。如:false&&true,执行到false就得出结果,没有执行到true
  • |与||的区别

    • |:|前后都要判断,才得出结果

    • ||:只要||前面能决定结果,就不执行后一个。如:true||false,执行到true就得出结果,没有执行到false

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8BHzs9mx-1596279041344)(D:\笔记\博客\images\或与.png)]


结果:
false
a=2
false
a=1
true
a=2
true
a=1

位运算符定义

​ 位运算符用来操作整数基本数据类型中的二进制位,按位运算就是对左右两个参数中对应的位执行布尔运算,0是false,1是true位运算符&、|、^ 也可以当做逻辑运算符来使用。

① & 与:有0出0,全1出1;
② | 或:有1出1,全0出0;
③ ~ 非:按位取反;
④ ^ 异或:相异为1,相同为0,一个数异或同一个数两次,结果还是那个 数. 用做一个简单的加密思想.;
⑤ << 向左移动:去掉高位,低位补0,在某些范围的数据移动n位相当于 乘于2^n;
⑥ >> 向右移动:去掉低位,高位补充,如果是负数,那么高位补充的是 1,如果是正数,高位补充的是0;
⑦ >>> 无符号向右移动:不管是正数还是负数,高位永远补充的是0。

位运算符可以用来加密数据,加密的数据无法恢复;位运算符也可以用来控制硬件的功能状态,开和关。

注意:
1.位运算符只能用于整型数据运算,不能用于运算浮点数据,如 10.23 & 1.2 是错的,无法通过编译;
2.位运算符返回的运算结果是int类型。


二进制运算(正码、反码、补码)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fNnrAomV-1596279041349)(D:\笔记\博客\images\逻辑运算符-&.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6GLnQNf-1596279041352)(D:\笔记\博客\images\逻辑运算符-^.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXQYCJqd-1596279041353)(D:\笔记\博客\images\逻辑运算符-~.png)]


案列1:置换两个数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54zD93Kb-1596279041355)(D:\笔记\博客\images\逻辑运算符案列-^.png)]

初始值:i = -1
正码:1000 0001
反码:1111 1110
补码:1111 1111

初始值:j = 2
正码:0000 0010
反码:0000 0010
补码:0000 0010

第一运算语句:
i = (byte)(i ^ j)
i = 1111 1111 ^ 0000 0010 = 1111 1101(补码)

第二运算语句:
j = (byte)(i ^ j)
j = 1111 1101 ^ 0000 0010 = 1111 1111(补码)

第三运算语句:
i = (byte)(i ^ j)
i = 1111 1101 ^ 1111 1111 = 0000 0010(补码)

最终:
i = 0000 0010(补码) -> 0000 0010(反码) -> 0000 0010(正码) 	-> 2(十进制)
j = 1111 1111(补码) -> 1111 1110(反码) -> 1000 0001(正码)	-> -1(十进制)

案列2:求2的幂(只对2的倍数有效,因为是二进制)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bw7RRvlL-1596279041357)(D:\笔记\博客\images\求次方.png)]

结果:
2		->2+2^0
4		->2+2^1
8		->2+2^2
16		...
32
64
128
256
512
1024
初始值:base = 2, i = 0
正码(取后八位):0000 0010
反码(取后八位):0000 0010
补码(取后八位):0000 0010
2<<0 = 0000 0010 << 0 = 0000 0010 = 2

初始值:base = 2, i = 1
正码(取后八位):0000 0010
反码(取后八位):0000 0010
补码(取后八位):0000 0010
2<<0 = 0000 0010 << 1 = 0000 0100 = 4

初始值:base = 2, i = 2
正码(取后八位):0000 0010
反码(取后八位):0000 0010
补码(取后八位):0000 0010
2<<0 = 0000 0010 << 2 = 0000 1000 = 8
...

案列3:求余

注意:除数必须是2的次方!

@Test
public void test() {
    byte divisor = 4;
    byte dividend = 30;

    // 方式一
    int remainder = dividend % divisor;
    System.out.println("remainder --> " + remainder);  // 2

    // 方式二
    int versusRemainder =  dividend & (divisor - 1);
    System.out.println("versusRemainder --> " + versusRemainder);  // 2
}
初始值:divisor = 4
正码:0000 0100
反码:0000 0100
补码:0000 0100
	   divisor - 1
正码:0000 0011
反码:0000 0011
补码:0000 0011

初始值:dividend = 30
正码:0001 1110
反码:0001 1110
补码:0001 1110

versus_remainder = dividend & (divisor - 1)
divisor - 1    补码:0000 0011
dividend       补码:0001 1110  &
               ------------------
               补码:0000 0010
               反码:0000 0010
               正码:0000 0010
               十进制:2
  • 3
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

Coding~Farmer

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值