因此,我正在阅读“ 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循环中右移。我一直认为右移是为了使代码下移10,但是我不明白左移的目的。有人可以解释一下吗?举个例子。

最佳答案

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


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

10-08 14:27