gpt4 book ai didi

Java:左移

转载 作者:行者123 更新时间:2023-11-29 04:41:02 25 4
gpt4 key购买 nike

所以我正在阅读“Java:初学者指南”并且有这样的代码:

class ShowBits{
int numbits;

ShowBits(int n){
numbits = n;
}

void show(long val){
long mask = 1;

mask<<=numbits-1;

int spacer=0;
for(;mask!=0;mask>>>=1){
if(val & mask) != 0) System.out.print("1");
else System.out.print("0");
spacer++;
if((spacer % 8)==0){
System.out.print(" ");
spacer=0;
}
}
System.out.println();
}
}

我看过this question为什么此人的代码不起作用。

但是,我不明白第一个初始左移的目的是

left-shifts a 1 into the proper position

我什至不知道这意味着什么以及为什么您需要 numbits - 1 - 然后在 for 循环中右移。我一直认为右移是为了把代码往下放10,但我不明白左移的目的。有人可以解释一下吗?也许有一个例子。

最佳答案

您引用的代码看起来很糟糕,不应该出现在书中。

  • ShowBits是一个糟糕的类名;它不遵循 Java 命名约定。
  • 整个类(class)都很臃肿。此功能(打印 long 值的位)非常适合简单的 static方法。
  • 当你设置numbits对于不能被 8 整除的数字,输出会产生误导,因为这些位是从左侧而不是右侧分组的。
  • 掩码应该简单地初始化为1L << (numbits - 1) (有适当的间距,中间没有段落。
  • 由于变量spacer重置为 0,% (模)运算符是不必要的。

Herbert Schildt 的书通常错误百出,请避免阅读。


回答您的实际问题:int有 32 位。当你用二进制写下来时,它看起来像这样:

00000000 00000000 00000000 00000000

为了打印二进制数,代码使用位掩码自行提取每一位。位掩码依次获得以下值:

10000000 00000000 00000000 00000000
01000000 00000000 00000000 00000000
00100000 00000000 00000000 00000000
00010000 00000000 00000000 00000000
00001000 00000000 00000000 00000000
00000100 00000000 00000000 00000000
00000010 00000000 00000000 00000000
00000001 00000000 00000000 00000000
00000000 10000000 00000000 00000000
...

这个系列中的第一个值是从 1 开始构造的:

00000000 00000000 00000000 00000001

这个 1 被 << 向左移动(使用 numbits - 1 运算符)次。所以当numbits是 32(在我的整个例子中),1 将在最左边的位置结束:

10000000 00000000 00000000 00000000

关于Java:左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com