java byte移位,Java byte 移位操作 注意事项

本文详细解析了Java中byte类型进行位运算时遇到的问题,包括右移操作导致的符号位扩展、隐式类型转换带来的影响,以及如何通过位与运算避免这些问题。通过实例代码展示了解决方案,确保正确实现右移一位后再与0x01进行位或运算,得到预期结果00111101。
摘要由CSDN通过智能技术生成

Java对byte 的 + - * / >> >>> << & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题:

假设我们想进行如下byte运算: 1111 1000 右移1位,再与0000 0001 或运算,得 0111 1101。

直觉写程序如下:

byte b = 0xf8;

byte b2 =  b >> 1 | 0x01;

这个写法里有多重错误,现逐个纠正:

1 编译器报错,int无法直接自动转化为byte

为解决此问题,加强制转化。

byte b = (byte)0xf8;

byte b2 = (byte)( (b >> 1) | 0x01);

2 输出为 1111 1101 不是我们想要的 0011 1101

原因是>> 是有符号右移,当符号位为1时,左侧补的是1而非0。

修改为使用 >>> 无符号右移:

byte b = (byte)0xf8;

byte b2 = (byte)( (b >>> 1) | 0x01);

3 运行后发现输出依然为 1111 1101

原因是byte在运算前先转化为int再行位运算,因此分解后的运算步骤如下:

b 转化为int  1111 1000 转化为      11111111 11111111 11111111 11111000

无符号右移1位                      01111111 11111111 11111111 11111100

与 0x01 按位或

01111111 11111111 11111111 11111101

强制转化回byte

11111101

解决方案,在右移运算前先 位与 0xff

byte b = (byte)0xf8;

byte b2 = (byte)( ((b & 0xff )>>> 1) | 0x01);  //注意必须加括号,因为 >>> 的优先级高于 &

4 运行后发现输出为我们想要的结果  0111 1101。运算步骤分解如下:

b 转化为int  1111 1000 转化为   11111111 11111111 11111111 11111000

和0xff 进行 & 操作              00000000 00000000 00000000 11111000

无符号右移1位

00000000 00000000 00000000 01111100

与 0x01 按位或

00000000 00000000 00000000 01111101

强制转化回byte

01111101

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值