我正在创建一个掩码并在这样的短路中设置更高的位:
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位中的任何一位?
答案 0 :(得分:3)
short
已签名,您的面具为否定。当它扩展到int
时保留。您可以通过屏蔽掩码使高位为零:
len |= (mask & 0xffff);
现在,如果len
是int
或long
,那么就是{{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以避免溢出,
没有。没有溢出是可能的,所以这不是原因。原因是为了与其他可能溢出的操作保持一致,即+, - ,*,/。