位移位—java中的位移位

qeeaahzv  于 2021-07-09  发布在  Java
关注(0)|答案(7)|浏览(403)

我相信这是一个容易的人看到它第一!
为什么java中的代码

long one = 1 << 0;
   long thirty = 1 << 30;
   long thirtyOne = 1 << 31;
   long thirtyTwo = 1 << 32;

   System.out.println(one+" = "+Long.toBinaryString(1 << 0));
   System.out.println(thirty+" = "+Long.toBinaryString(1 << 30));
   System.out.println(thirtyOne+" = "+Long.toBinaryString(1 << 31));
   System.out.println(thirtyTwo+" = "+Long.toBinaryString(1 << 32));

打印

1 = 1
1073741824 = 1000000000000000000000000000000
-2147483648 = 1111111111111111111111111111111110000000000000000000000000000000
1 = 1

这对我来说毫无意义。 long 是一个64位的数字-而它看起来像一个 int 在上面。我知道有点不对劲 byte 我们升职了,但我看不出这件事是怎么回事。
任何关于这里发生的事情的建议都是好的:)
谢谢
编辑:感谢所有的答案-我意识到发生了什么事,只要我点击'提交',但因此进入 readonly 模式,我不能删除!非常感谢!

bbmckpt7

bbmckpt71#

因为1是一个 int 字面意思,所以 << 应用于整数。结果被抛到一边 long ,但到那时已经太迟了。
如果你写1l<<32等,那么一切都会好的。 L 用来表示 long 字面意义的。

yhxst69z

yhxst69z2#

这是因为 1 排队 long thirtyTwo = 1 << 32; 是一个 int 默认情况下。在执行移位操作之前,需要将其显式标记为long。现在发生的是你在一个 int 轮班结束后,从一个 intlong .

long one = 1l << 0;
   long thirty = 1l << 30;
   long thirtyOne = 1l << 31;
   long thirtyTwo = 1l << 32;
6mzjoqzu

6mzjoqzu3#

首先:
java语言规范第15.19段
轮班操作员
如果左侧操作数的提升类型为int,则只有右侧操作数的五个最低阶位用作移位距离。这就好像右操作数接受了位逻辑“与”运算符&(§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31之间(包括0到31)。
如果左侧操作数的提升类型为long,则仅将右侧操作数的六个最低阶位用作移位距离。这就好像右操作数接受了位逻辑“与”运算符&(§15.22.1),掩码值为0x3f(0b111111)。因此,实际使用的移动距离始终在0到63之间(包括0到63)。
那么,为什么它的工作,如果你是转移 int s而不是 long 什么?因为你在转移 int s!尝试使用 long 改为文字:

long thirtyTwo = 1L << 32;
doinxwow

doinxwow4#

你使用的是int文本,它的行为类似于int。使用长文字(即。 1L )取而代之的是:

System.out.println(1 << 31);
System.out.println(1L << 31);  // <--
-2147483648
2147483648

当你有这样的表情 1 << 31 ,它的计算结果是一个固定的值,而不管它被赋给什么 int 或者 long .

dgsult0t

dgsult0t5#

literal 1是一个int。请使用1l(长度为l)并重试。

xjreopfe

xjreopfe6#

问题是 1 是一个整数。它将在换班后很长一段时间内被转换成一个。尝试

long one = 1l << 0;
   long thirty = 1l << 30;
   long thirtyOne = 1l << 31;
   long thirtyTwo = 1l << 32;
bfnvny8b

bfnvny8b7#

它就像一个 int 因为你在转移情报!要移动一个长的,你必须在所有的数字后面加上后缀 l .

long one = 1l << 0;
long thirty = 1l << 30;
long thirtyOne = 1l << 31;
long thirtyTwo = 1l << 32;

System.out.println(one+" = "+Long.toBinaryString(1l << 0));
System.out.println(thirty+" = "+Long.toBinaryString(1l << 30));
System.out.println(thirtyOne+" = "+Long.toBinaryString(1l << 31));
System.out.println(thirtyTwo+" = "+Long.toBinaryString(1l << 32));

结果如下:

1 = 1
1073741824 = 1000000000000000000000000000000
2147483648 = 10000000000000000000000000000000
4294967296 = 100000000000000000000000000000000

相关问题