java位运算

位运算详解

Java位运算细化划分可以分为按位运算和移位运算,见下表。

在这里插入图片描述

在进行位运算详解之前,先来普及下计算机中数字的表示方法。对于计算机而言,万物皆0、1,所有的数字最终都会转换成0、1的表示,有3种体现形式,分别是:原码、反码和补码。

原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0,负数位该位为1.比如十进制的5如果用8个二进制位来表示就是00000101,-5就是10000101。

反码:正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。5的反码就是00000101,而-5的则为11111010。

补码:正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+1。即在反码的基础上+1。5的反码就是00000101,而-5的则为11111011。

了解了这几个概念后,我们现在先记住一个结论,那就是在计算机系统中,数字一律用补码来表示、运算和存储。

2.1 与运算(&)

规则:转为二进制后,两位为1,则结果为1,否则结果为0。
在这里插入图片描述

System.out.println(Integer.toBinaryString(-6));
System.out.println(Integer.toBinaryString(-2));
System.out.println("位运算之后");
System.out.println(Integer.toBinaryString(-6 & -2));
System.out.println(-6 & -2);

最后的计算结果11111111111111111111111111111010还是补码的形式,要看其十进制,还需要先转成二进制原码。

先转反码:11111111111111111111111111111010-1=11111111111111111111111111111001,得反码11111111111111111111111111111001。

再转原码:在反码的基础上转原码,符号位不变,其他各位取反,得10000000000000000000000000000110。第一位1代表负数,后面0110转成十进制是6,得-6。

2.2 或运算(|)

规则:转为二进制后,有一位为1,则结果为1,否则结果为0。

举例:

在这里插入图片描述

2.3 非运算(~)

规则:转为二进制后,~0 = 1,~1 = 0。

举例:

在这里插入图片描述

11111111111111111111111111111000(补码需转换为原码)

11111111111111111111111111111000-1得反码

11111111111111111111111111110111。根据反码得原码10000000000000000000000000001000。

在这里插入图片描述

2.4 异或运算(^)

规则:转为二进制后,两位不相同,结果为1,否则为0。

举例:

在这里插入图片描述

2.5 左移运算(<<)

规则:转为二进制后,各二进制位全部左移N位,高位丢弃,低位补0。

举例:
在这里插入图片描述

2.6 右移运算(>>)

规则:转为二进制后,各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1。

举例:

在这里插入图片描述

2.7 无符号右移运算(>>>)

规则:转为二进制后,各二进制位全部右移N位,无论正负,都在高位插入0。

举例:

在这里插入图片描述
以下位运算同样会造成数据溢出

 System.out.println(~(1 << 31));
 System.out.println((1 << -1)-1);
 System.out.println(~(1 << -1));
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值