gpt4 book ai didi

java - 在 Java 中将字节转换为 int 的最优雅方法

转载 作者:IT老高 更新时间:2023-10-28 21:15:21 24 4
gpt4 key购买 nike

示例代码:

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

我想知道这是不是 a & 0xff是进行这种转换的最优雅的方式。 checkstyle例如,提示在这个地方使用了一个魔数(Magic Number),在这个检查中忽略这个值不是一个好主意,因为在其他地方 255 可能真的是一个应该避免的魔数(Magic Number)。我自己为这样的东西定义一个常数是很烦人的。所以我想知道JRE中是否有一种标准方法可以代替这种转换?或者可能是一个已经定义的具有最高无符号字节值的常量(类似于 Byte.MAX_VALUE,它是最高的有符号值)

所以为了简短起见:如何在不使用魔数(Magic Number)的情况下将字节转换为 int?

好的,到目前为止,提到了以下可能性:

  • 继续使用& 0xff并忽略 checkstyle 中的魔数(Magic Number) 255。缺点:在其他范围(不是位操作)中可能使用此数字的其他地方也不会被检查。优点:简短易读。
  • 为它定义我自己的常量,然后使用像 & SomeConsts.MAX_UNSIGNED_BYTE_VALUE 这样的代码.缺点:如果我在不同的类中需要它,那么我必须为这个该死的常量定义我自己的常量类。优势:这里没有神奇的数字。
  • 做一些巧妙的数学运算,例如 b & ((1 << Byte.SIZE) - 1) .编译器输出很可能是相同的,因为它被优化为一个常量值。缺点:代码多,难以阅读。优势:只要1没有定义为魔数(Magic Number)(checkstyle 默认忽略它)我们这里没有魔数(Magic Number),我们不需要定义自定义常量。当某天字节被重新定义为 16 位时(开个玩笑),它仍然有效,因为 Byte.SIZE 将是 16 而不是 8。

还有更多的想法吗?也许其他一些聪明的按位运算比上面的更短,并且只使用像 0 和 1 这样的数字?

最佳答案

进行这种转换的标准方法。如果您想摆脱 checkstyle 的提示,请尝试定义一个常量,它可能会有所帮助:

 public final static int MASK = 0xff;

顺便说一句 - 请记住,它仍然是自定义转换。 byte 是有符号的数据类型,因此 byte 永远不能保存值 255。一个字节可以存储位模式1111 1111,但这表示整数值-1

所以事实上你是在做位操作——位操作总是需要一些魔数(Magic Number)。


BTW-2 :是的,有一个 Byte.MAX_VALUE 常量,但这是 - 因为 byte 已签名 - 定义为 27 -1 (= 127)。所以对你的情况没有帮助。 -1 需要一个字节常量。

关于java - 在 Java 中将字节转换为 int 的最优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com