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);

现在,如果lenintlong,那将是,但由于它很短,它不会拥有那些更高的位。所以实际上,代码的其他部分正在扩大。

【讨论】:

@user1071840 如果 len 是负数,它同样可以扩大到负 int elsewhere,而不是在您显示的代码中。 (无论如何,上面的屏蔽是完全没有必要的——短片不会有这些位,len 不能有你展示给我们的值)。但是,这是您可以使用的技术(但您也应该考虑 BitSet,就像 Rohit Jain 建议的那样)。 哦,现在我明白了。情况是这样的:我必须将 6 个标志值存储在一个已经设计和填充并且正在使用的标头中。所以我没有多余的空间来放置这些标志。我确实有一个永远不会占用超过 10 位的短值,所以我们决定使用这 6 位。在short中设置最高位是不可避免的..这当然会使它变成负数..我应该怎么做? @user1071840 在你扩大它之前它不会是一个问题,因为只要它是一个短的就不会有任何更高的位。如果您需要将它与 int 组合(或任何其他导致扩大转换的原因),您可以使用 len &amp; 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 并返回奇怪的值的主要内容,如果未能解决你的问题,请参考以下文章

Java:必须转换为short,不能使用速记'S'

Java基础_赋值运算

java String类型 “你好” 转 short[]类型 麻烦快

Java HashSet和数据类型Short,不兼容?

java简单运算-short类型与int类型

java short 数组转换 byte