Java:左移

时间:2016-08-27 20:56:18

标签: java

所以我正在阅读" 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 s,但我不明白左移的目的。有人可以解释一下吗?也许是一个例子。

1 个答案:

答案 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