深入理解Java中的位操作

与、或、非、位移

原码、反码、补码

字节、位、超区间......

开始本章节之前,我们先思考一个问题:

byte a = 33;
byte b = -3;

若我们输出a、b的二进制字符串是多少?

答案是这样的么?

a->// 00100001
b->// 10100001

当然同学们可能会觉得我既然问了就肯定不是这样;是吧~别着急你们试试就知道了。

在Java中输出一个值对应的二进制方法有很多,这里提供一个简单的方法:

int value = 33;
String bs = String.format("%32s", Integer.toBinaryString(value)).replace(" ", "0");

在方法中是int值,int占4字节32位,所以是:“%32s” 若是byte将32改成8即可;当然对于byte你还需要加上**“&0xFF”**来做高位清零操作。

String bs = String.format("%8s", Integer.toBinaryString(value&0xFF)).replace(" ", "0");

基本原则

在Java中是采用的有符号的运算方式,故:高位为符号位,其余位存储数据信息。

简单来说:

+1 ->// 00000001
-1 ->// 10000001

默认例子中的值都按byte来算,占8位,减少大家的记忆负担。

因为byte占8位,所以有效数据存储7位,最高位为符号位。int值则是31位存储数据。

0 代表正数

1 代表负数

上述的-1的表示方法其实并不是机器码,而是人脑的理解方式。

我们认为+1与-1的差异就是高位不同而已,这是我们基于自然规律来看的;而机器真正存储的值其实是:11111111;这里其实就给大家提到了最初的问题。

二进制的计算规则是:逢2进1

这个很好理解,因为表示的数字就是:0、1两个数字,想要表示更大的值就只能往前递增进步。

在平时生活中是逢10进1;因为咱们有10个数字:9、8、7、6、5、4、3、2、1、0;所以11就是:当为0|9增加为10的时候就进一格所以变成:1|0,个位再把剩余的1补上就是:1|1;所以就是11。

那么:

1就是:0|0|0|0|0|0|0|1 
2就是:0|0|0|0|0|0|1|0 
3就是:0|0|0|0|0|0|1|1
4就是:0|0|0|0|0|1|0|0 

运算法则

 

byte a = (byte) 0b01011000; // 88
byte b = (byte) 0b10101000; // -88
int n = 1;

按位与 a & b

 

输入2个参数

a、b对应位都为1时,c对应位为1;反之为0。

按位或 a | b**

 

输入2个参数
a、b对应位只要有一个为1,c对应位就为1;反之为0。

按位异或 a^b

 

输入2个参数
a、b对应位只要不同,则c对应位就为1;反之为0。

按位取反(非)

 

输入1个参数
c对应位与输入参数a完全相反;a对应位为1,则c对应位就为0;a对应位为0,则c对应位就为1。

左移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值