逻辑运算符和位运算符(>>,<<,>>>)

一、运算符的分类

  1. 算数运算符:+,-,*,/,%,++,–
  2. 赋值运算符:=,+=,*=,/=,-=
  3. 关系运算符:==,!=,<=,>=,<,>,instanceof
  4. 逻辑运算符:&(并且,与),|(或者),!(非),^(异或),&&(短路与),||(短路或)
  5. 位运算符:&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
  6. 三目运算符:(关系表达式) ? 表达式1 : 表达式2;

二、逻辑运算符

  1. &:并且,在运算的过程中如果&的左边是false,右边要执行,且两边只要有一个false则结果为false。

  2. &&:短路与,运算时&&左边为false,右边不执行。

    ​ 两侧表达式运算结果:有false,则结果为false

  3. ||:短路或,运算时||左边为true则右边不执行。

    ​ 两侧表达式运算结果:有true,则结果为true

  4. |:或者,运算时不论|左右结果为哪一个,都要执行。

    ​ 两侧表达式运算结果:有true,则结果为true

  5. !:非,!false 结果为true,!true结果为 false

  6. ^:异或,运算时两侧结果相同,运算结果为false,不同为true

案例:

      int a=2;
      int b=3;
      if(a++==3&++b==4){
        a=23;
      }      
      System.out.println("a="+a);
      System.out.println("b="+b); 
结果是a=3;b=4
     int m=3;
     int n=6;
     if(m++==3|--n==4){
       m=12;
    }
     System.out.println("m="+m);
     System.out.println("n="+n);  
结果是m=12;n=5

三、位运算符

  1. &(与),有0则0
  2. |(或),有1则1
  3. ^(异或) ,相同为0,不同为1
  4. ~(按位取反) ,有1为0,有0为1
  5. <<(左移),先求该数的补码,再向左移动右边的位数,空位补0,最高位丢弃,最后将移动后的二进制数转为十进制数
  6. >>(右移),先求该数的补码,再向右移动右边的位数,最高位为0,空位补0,最高位是1,空位补1,最后将移动后的二进制数转为十进制数
  7. >>>(无符号右移),先求该数的补码,再向右移动右边的位数,空位补0,最高位丢弃,最后将移动后的二进制数转为十进制数

案例:

原码(-100)1110 0100
      反码:1001 1011(符号位不变,其他位取反)
      补码:1001 1100(反码+11为二进制的)
原码(9)0000 1001--------------->正数的原、反、补码是一样的
   反码:0000 1001
   补码:0000 1001
    
左移:将-100左移三位是:-32
       |1 0 0 1  1 1 0 0|
      1|0 0 1 1  1 0 0 0|------->左移一位 
    1 0|0 1 1 1  0 0 0 0|------->左移一位 
  1 0 0|1 1 1 0  0 0 0 0|------->左移一位            
       |左移三位后的数的补码
    补码:1 1 1 0  0 0 0 0(被左移的数为负数)
    反码:1 1 0 1  1 1 1 1---------------->补码求原码,给补码-1 
    原码:1 0 1 0  0 0 0 0------->左移三位的数为-32
    
右移:将-100右移三位是:
    |1 0 0 1  1 1 0 0|
     1|1 0 0  1 1 1 0|0------------->右移一位
     1 1|1 0  0 1 1 1|0 0------------->右移一位
     1 1 1|1  0 0 1 1|1 0 0------------>右移一位 
      右移三位的数     |----->再求它的反码---原码就是要求的数
          | 原数的补码      |
    
无符号右移:将-100右移三位是:    
    |1 0 0 1  1 1 0 0|
     0|1 0 0  1 1 1 0|0------------->右移一位
     0 0|1 0  0 1 1 1|0 0------------->右移一位
     0 0 0|1  0 0 1 1|1 0 0------------>右移一位 
      右移三位的数     |----->再求它的反码---原码就是要求的数
          | 原数的补码      |       

左移,右移的求法(针对于正数):

​ 左移<<:给原数乘以2的移动次数幂 100<<3 是 100*2^3=800

​ 右移>>:给原数除以2的移动次数幂 100>>3 是 100/2^3=12

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值