你真的了解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类型?