专栏首页Play & Scala 技术分享你真的了解Java中的位操作?

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

位操作谜题

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

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.

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

b & 0xff

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

11111111 11111111 11111111 11111111

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

00000000 00000000 00000000 11111111

执行&操作,结果为:

00000000 00000000 00000000 11111111

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

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

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.");
        }
    }
}

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Play运维技巧 - 使用JMX开启远程性能监控

    joymufeng
  • Netty基础 - 为什么ChannelOutboundHandler会声明一个read方法?

    joymufeng
  • 挑逗 Java 程序员的那些 Scala 绝技

    有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它...

    joymufeng
  • 几点Java程序必须满足的基本规则

    Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允...

    博文视点Broadview
  • 2016 年 7 个最佳的 Java 框架

    毫无疑问,Java是目前最需要的编程语言之一。在这里,我们已经挖掘了一些关于框架趋势的有用信息,以减轻全球软件开发人员的日常工作。

    Java团长
  • 2016 年 7 个最佳的 Java 框架

    毫无疑问,Java是目前最需要的编程语言之一。在这里,我们已经挖掘了一些关于框架趋势的有用信息,以减轻全球软件开发人员的日常工作。

    哲洛不闹
  • 2017年8月开发语言TOP10,JAVA老三。

    上图是国外一家专业杂志IEEE Spectrum给出的专业的语言流行度的趋势报告。 Python已经爬到第一,比去年第4名上升了三个档次。C#重新进入了前五,去...

    Java技术栈
  • 编写高质量代码:改善Java程序的151个建议

    在通往“Java技术殿堂”的路上,本书将为你指点迷津!内容全部由Java编码的最佳实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面对J...

    用户3157710
  • Java运行原理及内存分析

    泰斗贤若如
  • 最适合人工智能的编程语言:JAVA人工智能程序编程

    可用于开发人工智能项目的程序编程语言列表,包括Python,POP-11,C ++,MATLAB,Java,Lisp和Wolfram语言。在本文中,你会了解Ja...

    AiTechYun

扫码关注云+社区

领取腾讯云代金券