2016-08-27 85 views
1

所以我读的“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之间,但我不明白左移的目的。有人可以解释吗?也许有一个例子。

+5

要明白,你需要一步通过与调试方法,*以二进制*查看数字。当你看到个别位时,应该清楚发生了什么。 – hyde

回答

3

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

  • ShowBits是一个不好的类名;它不遵循Java命名约定。
  • 整个班级都很臃肿。该功能(打印long值的位)很好地适用于简单的static方法。
  • 当您将numbits设置为不能被8整除的数字时,输出会产生误导,因为这些位是从左侧分组的,而不是从右侧分组的。
  • 掩模应该简单地被初始化为1L << (numbits - 1)(与适当的间隔,而不是在它们之间的一个段落。
  • 由于变量spacer被复位到0时,%(模)运算是不必要的。

赫伯特·希的书通常是充满了错误,请避免阅读它们


为了回答您的实际问题:一个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 
+0

谢谢。我理解左右偏移,但我不明白那个代码;但是,你告诉我这是写得不好的代码,所以我会忘记。我理解左右轮班的概念。除Herbert Schildt的书外,你还有什么书可以推荐吗? – Lawleyenda

+0

不幸的是,我不知道任何Java初学者书籍。抱歉。 –

+0

你是如何学习的? – Lawleyenda