1

相关问题:Java On AND'ing a short with an short,它升级为 int 并返回奇怪的值

我有一个短的(2 字节)空间,应该用于设置 16 个标志,每个位一个。我必须编写一个 API 来设置/检查/清除第 n 位(n = 0、1..15)。问题出现在 MSBit 的情况下。

我是这样设置的:

 short setBit(short flags, int n) {
     flags |= (1 << n);
     return flags;
 }      

当 n 为15我设置符号位时,结果值为 : 1111111111111111111111111111111111111111111111111000000000000000

我试图通过以下方式从中获取低 16 位:

            flags &= 0xffff;

我得到了与预期相同的答案,因为符号位保持不变。如何设置最高位并且不最终转换类型并让符号位扩展/填充其余空间?(这些标志将被写入磁盘)。

4

2 回答 2

1

您的问题源于 Java 的隐式类型提升系统。

为了抵消 Java 的“有用”类型提升,明智的类型转换是为了......

short setBit(short flags, int n) {
  return (short)( flags | (short)(1 << n));
}

此外,您可以在打印时避免类型提升:(以十六进制打印)

System.out.printf("%x\n",setBit(myShortVariable,15));
于 2013-10-13T19:15:36.443 回答
0

使用 achar而不是 a short
请参阅:java中的无符号短

 char setBit(char flags, int n) {
     if (n <= 15) {
       char bit = (1 << n); 
       flags |= bit;
     }
     return flags;
 }  
于 2013-10-05T19:17:15.963 回答