2016-08-27 64 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