前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你真的了解Java中的位操作?

你真的了解Java中的位操作?

作者头像
joymufeng
发布2018-05-17 15:51:39
7310
发布2018-05-17 15:51:39
举报
文章被收录于专栏:Play & Scala 技术分享

位操作谜题

下面这行代码会输出什么?

代码语言:javascript
复制
byte b = -1;
System.out.println(b & 0xff);

一个byte占8位,再和8位都为1的0xff与操作,那么结果应该是它本身才对,可是运行上面的代码输出却是255。 要想读懂上面的代码,首先我们要弄清楚以下几个问题。

Java如何编码正数和负数?

在Java中数值类型的首位(bit)表示符号位,0表示正数,1表示负数。但是需要注意的是,由于Java采用”2的补码“(Two's Complement)编码负数,所以如果把负数的首位改成0,修改后的值和其绝对值并不相等,所以处理负数时要格外小心。

位操作符(Bitwise Operators)的操作数类型是什么?

Java语言规范2中明确指出位操作符(Bitwise Operators)只作用于integer类型(其实也可以作用于long类型)。所以如果操作数是byte/short类型,则在位操作之前会被转换成integer类型。详情请参考Java 语言规范 5.6.2. Binary Numeric Promotion

0xff返回的类型是什么?

0xff返回的是32位integer类型。在Java中integer类型(例如1)有三种表示方式:十进制(1)、八进制(01)和十六进制(0x01)。

byte类型如何被转换成integer类型?

在Java中窄类型向宽类型转换时需要进行符号位扩展,如果该byte是负数则左边要补齐相应个数1,如果是正数则要补齐相应个数0.

我们再回头看上面的代码:

代码语言:javascript
复制
b & 0xff

在&操作之前,b被转换成integer类型,左边用符号位1补齐:

代码语言:javascript
复制
11111111 11111111 11111111 11111111

0xff是integer字面量,二进制值为:

代码语言:javascript
复制
00000000 00000000 00000000 11111111

执行&操作,结果为:

代码语言:javascript
复制
00000000 00000000 00000000 11111111

返回结果是integer类型,符号位是0,所以是一个正数,值为255。

下面是一个更复杂的例子,功能是将长度为4的byte数组转换成integer类型:

代码语言:javascript
复制
public class BytesArrayToInt {
    public static void main(String[] args) {
        System.out.println(byteArrayToInt(new byte[]{0x01, 0x01, 0x01, 0x01}));
    }

    public static int byteArrayToInt(byte[] b) {
        if (b.length == 4) {
            return b[0] << 24 | (b[1] & 0xff) << 16 | (b[2] & 0xff) << 8 | (b[3] & 0xff);
        } else {
            throw new InvalidParameterException("The bytes array length must be 4.");
        }
    }
}

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 位操作谜题
  • Java如何编码正数和负数?
  • 位操作符(Bitwise Operators)的操作数类型是什么?
  • 0xff返回的类型是什么?
  • byte类型如何被转换成integer类型?
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档