按位运算符

按位运算符

将数据在内存中二进制存储按照位运算计算得出最终结果

& 按位与,相当于”并且”(对整型和布尔计算)

| 按位或,相当于”或者”(对整型和布尔计算)

按位或/按位与不会出现逻辑或/逻辑与的短路现象

~ 按位非(只对整型计算)

^ 按位异或(对整型或布尔计算)

    /*
    *对布尔进行计算
    */
public class BitOperator{
    public static void main (String []args){
        /*
        *按位与&,不短路底层按位进行计算
        */
        int n = 6;
        int m = 7;
        int k = 8;
        boolean bool = m < n & m == --k;
        System.out.println(bool);//输出结果为false
        System.out.println(k);//输出结果为7,前面虽然已经能判断结果,但依旧计算
        /*
        *按位或|,不短路底层按位进行计算
        */
        boolean bool2 = m>n | ++n == m;
        System.out.println(bool2);//输出结果为true
        System.out.println(n);//输出结果为7,前面虽然已经能判断结果,但依旧计算
    }
}

对整数运算

按位与& 如果两个整数对应位都是1则结果为1,否则为0

按位或| 如果两个整数对应位都是0则结果为0,否则为1

5&4 结果为4 -5&5 结果为 1(0 0001)

二进制表示 5  0 0101         -5 1 1011

                   4  0 0100          5 0 0101

                       0 0100             0 0001

5|4 结果为5 -5|5 结果为 -15(1 1111)

二进制表示 5  0 0101 -5 1 1011

                   4  0 0100  5 0 0101

                       0 0101     1 1111

按位非~(单目运算符)对一个整数进行按位计算

如果位是0,结果为1,如果位是1,结果为0

~5 结果为-6(1 1010)

二进制表示5 0 0101

取反后          1 1010

按位异或运算符(草帽运算符)

^  2个布尔表达式计算结果相同则最终结果为false,否则为true


public class BitOperator{
    public static void main (String []args){
    /*
    *按位异或^对布尔表达式计算,相同为false否则为true
    */
    System.out.println(“true异或true”+(1 = 1 ^ 3>2));//输出结果为false
    System.out.println(“true异或false”+(1 = 1 ^ 3<2));//输出结果为true
    }
}

对两个数按位对应比较,相同为0,不同为1

5^6结果为3(0 0011)

二进制表示 5 0 0101

                   6 0 0110

                      0 0011

移位运算符

<<   value<<num  左移

>>   value>>num  右移

>>>  value>>>num 无符号右移

Value:表示数值  num:表示一个移动的数值

左移运算符<<

丢弃最高位,0补最低位

移动位数超过了该类型的最大位数,则移动的位数取模(假如存储最大为24,要求左移30位,最终会左移6位)

在数字没有溢出的前提下,对于正数和负数,左移n位相当于乘以2的n次方

public class BitOperator{
    public static void main (String []args){
    int n = 2;
    System.out.println(n<<2);//相当于n左移两位,输出结果为8
    System.out.println(n<<32);//超出范围,相当于n左移(34%8)2位,输出结果为8
    }
}
    //二进制表示2 0000 0010
    //二进制表示8 0000 1000  

右移运算符>>

按二进制的形式把所有的位数向右移动相应的位数,低位移出(舍弃),高位的空位补符号位,即正数补0负数补1

右移n位相当于除以2的n次方

public class BitOperator{
    public static void main (String []args){
    int m = 5;
    System.out.println(n>>2);//相当于n右移2位,输出结果为1
    System.out.println(n>>9);//相当于n右移9位,输出结果为0
    System.out.println(-9>>2);//相当于-9右移2位,输出结果为-3
    }
}
//二进制表示  5  0101		-9	1 1001
//           8  0001		-3	1 0011

无符号右移运算符>>>

忽略符号位扩展,0补最高位

无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于整数来说这种运算没有意义

public class ShiftOperator{
    public static void main (String []args){
    int m = 5;
    System.out.println(-9>>>2);//相当于-9无符号右移2位,输出结果为1073741821
    }
}
//二进制表示-9 1 	1001
/*
  产生这个结果这是因为-9二进制表示中1001前边都是1,最高位变成0作为符号位,
  其他的1当做有效的数值位,所以就会出现这么大的数值
*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值