示例代码:
int a = 255;
byte b = (byte) a;
int c = b & 0xff; // Here be dragons
System.out.println(a);
System.out.println(b);
System.out.println(c);
所以我们从一个整数值255开始,将它转换成一个字节(变为-1),然后使用魔术公式将其转换成一个int。预期输出为:
255
-1
255
我想知道这个0xff是最优雅的转换方式。 checkstyle例如抱怨在这个地方使用魔术数字,这不是一个好主意,忽略这个检查的值,因为在其他地方255可能真的是一个魔术数字,应该避免。而且我自己定义一个这样的东西是非常烦人的。所以我想知道是否有一个标准的方法在JRE做这个转换?或者也可能是具有最高无符号字节值的已定义常量(类似于最高有符号值的Byte.MAX_VALUE)
所以要保持问题的简短:如何将一个字节转换为int而不使用魔术数字?
好的,到目前为止,提到了以下几种可能性:
>继续使用& 0xff并忽略checkstyle中的魔术数字255。缺点:也可以在其他范围(不是位操作)中使用此号码的其他地方。优点:简单易读。
>定义我自己的常量,然后使用& SomeConsts.MAX_UNSIGNED_BYTE_VALUE。缺点:如果我需要它在不同的类,那么我必须定义我自己的常量类只是为了这个常数。优点:这里没有魔术数字。
>做一些聪明的数学,如b& ((1< Byte.SIZE)-1)。编译器输出最有可能是相同的,因为它被优化为一个常量值。缺点:很多代码,难以阅读。优点:只要1没有被定义为魔术数字(checkstyle默认忽略它),我们在这里没有魔术数字,我们不需要定义自定义常量。而当字节重新定义为16位的某一天(只是开玩笑),那么它仍然可以工作,因为Byte.SIZE将是16而不是8。
有更多的想法吗?也许一些其他聪明的比特操作比上面的更短,只使用像0和1这样的数字?