如何在java中设置最高位?

时间:2013-10-05 19:02:27

标签: java type-conversion bit-manipulation bit sign

相关问题:Java On AND'ing a short with an short, it is upgraded to int and returns weird values

我有一个短(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;

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

2 个答案:

答案 0 :(得分:1)

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

为了抵制Java的“有用的”类促销,明智的类型转换是有序的......

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

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

System.out.printf("%x\n",setBit(myShortVariable,15));

答案 1 :(得分:0)

使用char代替short 请参阅:unsigned short in java

 char setBit(char flags, int n) {
     if (n <= 15) {
       char bit = (1 << n); 
       flags |= bit;
     }
     return flags;
 }