繁体   English   中英

将 long 移位超过 31 位(java)

[英]Shifting a long by more than 31 bits (java)

如果我想将long的第 37 位设置为 1,我相信我的代码将如下所示:

long l = 0;
l |=  0b1 << 37;

但是,这不起作用,因为long移位不能超过 31 位。 这让我很困惑,因为 Oracle 文档说 longs 是 64 位。 ( https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html )

我看过如何将 long 移位超过 32 位? ,但这似乎只适用于 c/c++。

我希望能够为具有 64 位的数据类型切换位。 我将如何在 Java 中做到这一点?

long l;
        
l = 0;
l |= 0b1 << 37;
System.out.println(l);
// Outputs 32
        
l = 0;
l |= 0b1L << 37;
System.out.println(l);
// Outputs 137438953472

您遇到的问题是您的操作会像这样崩溃:

l |= 0b1 << 37;

依次变成:

int _temp = 1 << 37;
l |= (long) _temp;

这样做的原因是因为0b1或任何缺少小数部分和尾随字母以指示您想要的文字类型的数字文字(D/F/L 表示 double/float/long),因此是int ,句点. 然后将这个 int 值( 1 ; 0b1毕竟是写1一种奇怪方式)左移 37。左移规范指出,移位操作的右手运算符仅考虑低 5 位int 移位,低 6 为长移位。 因为否则你只会将值someInt << 37 0。因此, someInt << 37是编写someInt << 5一种奇怪方式。

解决方案是确保您的轮班操作实际上发生在多头上。 有很多很多方法可以做到这一点。

使用长字面量

通过写一个尾随的 L。它可以写在任何一种情况下,但是如果你使用小写的 l,风格指南和开发人员会鸡蛋你的房子,因为这太愚蠢了,不要这样做。 它看起来像 1。因此:

l |= 1L << 37; // or if you must, 0b1L works too

一步一步来。

long temp = 1;
temp <<= 37;
l |= temp;

投射它

l |= ((long) 0b1) << 37;

这些都将完成工作:它们最终都让<<操作处于“长模式”(如果 LHS 是 long 类型,就会发生这种情况,在所有这 3 个示例中都是如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM