我有一种感觉,这是一个相当琐碎的问题,但我被难住了。在我的应用程序中,我使用一对整数作为查找表的键。我认为将这两个整数连接成一个长整型并使用单个长整型作为键会更容易。来自C背景的我希望像这样的东西能够工作:
int a, b;
long l = (long)a << 32 | b;
我的尝试在Java中复制这个操作让我感到沮丧。特别是因为没有无符号整数类型,我似乎无法避免b的自动符号扩展(a被左移以使其无关紧要)。我尝试使用b & 0x00000000FFFFFFFF,但令人惊讶的是它没有任何效果。我还尝试了相当丑陋的(long)b << 32 >> 32,但它似乎被编译器优化掉了。
我希望能严格使用原始数据类型进行位运算来完成此操作,但我开始怀疑是否需要使用某种缓冲对象来实现这一点。
(long)b << 32 >> 32
没有被优化掉。主要问题是>>是算术右移(sra),而>>>是逻辑右移(srl),你需要的是:(long)b << 32 >>> 32
。 - ideb & 0x00000000FFFFFFFF
必须正常工作,但是为什么你要用那些零来混淆它呢? - maaartinus0xFFFFFFFF
不会被符号扩展。但是还有一个问题,它只是一个int
(我们都忘了L
后缀),并通过符号扩展晋升为long
。这就是为什么它不能工作的原因。前导零不起任何作用,文字只是一个 int。看看我的答案,肯定是对的,我用过很多次。 - maaartinus(signed int) (b & 0xFFFFFFFF)
。结果是一个有符号整数,并通过符号扩展提升为长整型。 - maaartinus