Java On和一个简短的short,它被升级为int并返回奇怪的值

时间:2013-09-30 18:27:03

标签: java type-conversion bit-manipulation short

我正在创建一个掩码并在这样的短路中设置更高的位:

  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

据我所知,当我们对short进行位操作时,它们会升级到int以避免溢出,但为什么所有高位都设置好呢?如何在没有任何有趣的演员的情况下简单地设置前6位中的任何一位?

4 个答案:

答案 0 :(得分:3)

short已签名,您的面具为否定。当它扩展到int时保留。您可以通过屏蔽掩码使高位为零:

len |= (mask & 0xffff);

现在,如果lenintlong,那么就是{{1}}或{{1}},但由于它很短,所以无论如何都不会拥有那些更高的位。实际上,代码的其他部分正在发生扩大。

答案 1 :(得分:0)

看起来你还没有“和”。 &#39; |&#39;是或,&#39;&amp;&#39;是和。你还要做一个短线和一个短线,而不是短线和短线。您的打印声明甚至表示“正在”,而您的标题显示为“正在”。如果您使用&#39;&amp; =&#39;我相信它会解决你的问题。

答案 2 :(得分:0)

short转换为int时,会保留其数值。如果最高位为1,则short为负数,为了保留其值,int必须为负数 - 即int的最高位也必须是1,所以中间的所有位都是。

一般情况下,将short转换为int时,负数用1填充左边,正数用0填充左边。

答案 3 :(得分:0)

将结果简化为简短。您在int结果中获得了符号扩展,因为在掩码中设置了位0x8000,这是符号位。

  

当我们对短路进行位操作时,它们会升级到int以避免溢出,

没有。没有溢出是可能的,所以这不是原因。原因是为了与其他可能溢出的操作保持一致,即+, - ,*,/。