所以我正在阅读" 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为什么这个人的代码没有工作。
但是,我不明白第一次左移的目的
将1移动到正确的位置
我甚至不知道这意味着什么,为什么你需要numbits - 1
- 然后在for循环中右移。我一直认为正确的转变是将代码放到1
和0
s,但我不明白左移的目的。有人可以解释一下吗?也许是一个例子。
答案 0 :(得分:3)
你引用的代码看起来很糟糕,不应该出书。
ShowBits
是一个糟糕的班级名称;它没有遵循Java命名约定。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