Java On AND'ing short 与 short,它被升级为 int 并返回奇怪的值
Posted
技术标签:
【中文标题】Java On AND\'ing short 与 short,它被升级为 int 并返回奇怪的值【英文标题】:Java On AND'ing a short with an short, it is upgraded to int and returns weird valuesJava On AND'ing short 与 short,它被升级为 int 并返回奇怪的值 【发布时间】:2013-09-30 18:27:03 【问题描述】:我正在创建一个掩码并设置更高的位,如下所示:
enum FLAGS FLAG1, FLAG2, FLAG3, FLAG4, FLAG5, FLAG6;
public static void setFlag(short len, FLAGS flag)
short mask = 1 << (Short.SIZE - flag.ordinal() - 1);
len |= mask;
我打印了这些值:
len: 0000001111111100
mask : 1000000000000000
after OR'ing with mask: 11111111111111111000001111111100
我知道当我们对短裤进行位操作时,它们会被升级为 int 以避免溢出,但是为什么所有更高的位都设置了呢?我怎样才能简单地设置前 6 位中的任何一个而不进行任何有趣的转换?
【问题讨论】:
除了这个问题,你应该考虑改用BitSet
。
【参考方案1】:
short
已签名,您的掩码为负数。当它扩大到int
时,它会被保留。您可以通过屏蔽掩码使高位为零:
len |= (mask & 0xffff);
现在,如果len
是int
或long
,那将是,但由于它很短,它不会拥有那些更高的位。所以实际上,代码的其他部分正在扩大。
【讨论】:
@user1071840 如果 len 是负数,它同样可以扩大到负 int elsewhere,而不是在您显示的代码中。 (无论如何,上面的屏蔽是完全没有必要的——短片不会有这些位,len
不能有你展示给我们的值)。但是,这是您可以使用的技术(但您也应该考虑 BitSet,就像 Rohit Jain 建议的那样)。
哦,现在我明白了。情况是这样的:我必须将 6 个标志值存储在一个已经设计和填充并且正在使用的标头中。所以我没有多余的空间来放置这些标志。我确实有一个永远不会占用超过 10 位的短值,所以我们决定使用这 6 位。在short中设置最高位是不可避免的..这当然会使它变成负数..我应该怎么做?
@user1071840 在你扩大它之前它不会是一个问题,因为只要它是一个短的就不会有任何更高的位。如果您需要将它与 int 组合(或任何其他导致扩大转换的原因),您可以使用 len & 0xffff
技术来获取不带符号的 16 个低位的 int。【参考方案2】:
看起来你是在做 OR'ing 而不是 AND'ing。 '|'是或,'&' 是和。此外,您正在 OR'ing 一个 short 和一个 int,而不是一个 short 和一个 short。您的打印语句甚至说 OR'ing,而您的标题说 AND'ing。如果你使用 '&=' 我相信它会解决你的问题。
【讨论】:
【参考方案3】:当short
转换为int
时,其数值将被保留。如果最高位为 1,则 short
为负数,为了保持其值,int
必须为负数 - 也就是说,int
的最高位也必须为 1,两者之间的所有位也是如此。
一般情况下,将short
转换为int
时,负数左补1,正数左补0。
【讨论】:
感谢您的解释..请阅读我在上一个帖子中发布的描述(回复@kiheru)。【参考方案4】:只需将结果转换回短。您在 int
结果中得到符号扩展,因为在掩码中设置了位 0x8000
,即符号位。
当我们对短裤进行位操作时,它们会被升级为 int 以避免溢出,
没有。不可能溢出,所以这不是原因。原因是为了与其他可能溢出的操作保持一致,即+、-、*、/。
【讨论】:
以上是关于Java On AND'ing short 与 short,它被升级为 int 并返回奇怪的值的主要内容,如果未能解决你的问题,请参考以下文章