如何在java中设置最高位?
Posted
技术标签:
【中文标题】如何在java中设置最高位?【英文标题】:How to set highest bit in java short? 【发布时间】:2013-10-05 19:02:27 【问题描述】:相关问题: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;
我得到与预期相同的答案,因为符号位保持不变。如何设置最高位并且不最终转换类型并让符号位扩展/填充其余空间? (这些标志将被写入磁盘)。
【问题讨论】:
应该是无符号短片吗? 只是猜测一个你还没有完全清楚的短 s = 1 @ct_ 我不认为 java 支持无符号类型。 对不起 - 我应该更清楚。我在问你是否将 16 位视为有符号或无符号? @TonyHopkinson 这有什么不同? 【参考方案1】:您的问题源于 Java 的隐式类型提升系统。
为了抵消 Java 的 “有用” 类型提升,明智的类型转换是有序的......
short setBit(short flags, int n)
return (short)( flags | (short)(1 << n));
此外,您可以在打印时避免类型提升:(以十六进制打印)
System.out.printf("%x\n",setBit(myShortVariable,15));
【讨论】:
【参考方案2】:使用char
而不是short
。
见:unsigned short in java
char setBit(char flags, int n)
if (n <= 15)
char bit = (1 << n);
flags |= bit;
return flags;
【讨论】:
不是根据 jon skeet 的说法,但我想你知道得更好。 Jon 和我同意:“诚然,您可以使用 char - 它是一个 16 位无符号类型 - 但这太可怕了,因为 char 显然是用于文本的。” ***.com/questions/1841461/unsigned-short-in-java/… 我更喜欢这条评论:There seems to be no way in Java to have a normal machine‐level byte, meaning an 8‑bit location that can hold values [0–255] instead of [ −128 – +127 ]. I can’t believe they make us use signed bytes, when all you have to do in C is say unsigned char. Once you start down the road of signed datatypes only, it screws up all your unsigned bitmaps. Really quite unpleasant. The Java designers thought they were simplifying things to make them less error‐prone, but once again all they managed to do was make them a lot harder and more error‐prone than before.
@starblue,那么你如何设置最高位?
对于设置最高位,short
是有符号还是无符号都没有关系:***.com/questions/397867/…以上是关于如何在java中设置最高位?的主要内容,如果未能解决你的问题,请参考以下文章
如何在SAP中设置最高订货量maximum order quantity?