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