java中的位运算符

java中的位运算符

概述

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型

分类

左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符

说明

左移<<

    public static void main(String[] args) {
        int a= 10;

        System.out.println(a<<3);//80
    }

实质就是a乘2的3次幂;

原理

把10转换成二进制:

00000000 00000000 00000000 00001010

然后整体向左移动三位,不足位用0补齐:

00000000 00000000 00000000 01010000

结果就是80

被除数是负数的时候
System.out.println(-10<<3);//-80

右移>>

    public static void main(String[] args) {
        int a= 10;

        System.out.println(a>>3);//1
    }

实质就是10除以2的3次幂

原理

把10转换成二进制:

00000000 00000000 00000000 00001010

然后把数据整体向右移动三位,不足位用0补齐:

00000000 00000000 00000000 00000001

结果就是1

被除数是负数的时候
System.out.println(-10>>3);//-2

把-10的补码求出来:

原码:1 0000000 00000000 00000000 00001010

反码:1 1111111 11111111 11111111 11110101

补码:1 1111111 11111111 11111111 11110110

操作: 1 1111111 11111111 11111111 11111110 注意此处用1补位

反码:1 1111111 11111111 11111111 11111101

原码:1 0000000 00000000 00000000 00000010 就是-2

无符号右移>>>

没有无符号左移

System.out.println(10>>>3);

当要操作的数是正数的时候和普通右移结果相同

当数是负数的时候
        System.out.println(-10>>3);   //-2
        System.out.println(-10>>>3);    //536870910

把-10的补码求出来:

原码:1 0000000 00000000 00000000 00001010

反码:1 1111111 11111111 11111111 11110101

补码:1 1111111 11111111 11111111 11110110

操作:0 0011111 11111111 11111111 11111110 注意此处用0补位

正数的原反补相同结果就是536870910

正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)

位与&

System.out.println(10&5);//0

把10转换成二进制:

00000000 00000000 00000000 00001010

把5转换成二进制:

00000000 00000000 00000000 00000101

只有对应的两位都是1的时候才是1,否则就是0,那么结果就是0

位或|

System.out.println(10|5);//15

把10转换成二进制:

00000000 00000000 00000000 00001010

把5转换成二进制:

00000000 00000000 00000000 00000101

只有对应的两位某一个是1的时候结果就是1,否则就是0,那么结果就是15

位异或^

System.out.println(10^5);//15

把10转换成二进制:

00000000 00000000 00000000 00001010

把5转换成二进制:

00000000 00000000 00000000 00000101

当对应的两位不相等的时候是1,相同的时候是0,结果还是15

位非

System.out.println(~10 );//-11

把10转换成二进制:

00000000 00000000 00000000 00001010

求位非运算:

1 1111111 11111111 11111111 11110101

求反码:

1 1111111 11111111 11111111 11110100

求原码:

1 0000000 00000000 00000000 00001011 就是-11

衍生运算符

&= 按位与赋值

|= 按位或赋值

^= 按位非赋值

>>= 右移赋值

>>>= 无符号右移赋值

<<= 赋值左移

更多精彩好玩的文章请参见:天意的个人博客没有广告(⊙o⊙)哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值