2016-05-13 23 views
0

我試圖做一個方法,在使用BitSet在Java中環繞左移,但我無法弄清楚如何讓它執行環繞。現在我的方法只是刪除第一位,並保留其餘部分,而不是將第一位添加到最後。BitSet LeftShift環繞問題

public static BitSet leftShift(int amount, BitSet b){ 
    BitSet bit2 = new BitSet(b.length()); 

    for(int i = b.length(); i > 0; i--){ 
     bit2.set((i-amount)%b.length(), b.get(i)); 
    } 
    return bit2; 
} 
+0

通過「左移」你的意思是朝着更顯著以下顯著位轉移?你的代碼似乎試圖轉向不那麼重要,這通常被稱爲右移。 – Misha

+0

切換到較低有效位。所以11011將會是10111,並且會向左移動一次。 – user3614496

回答

2

您的代碼有2個問題。

  1. 循環邊界中的偏移錯誤。 BitSet索引是從零開始的。所以你應該從b.length() - 1開始計數到i >= 0或更好,但不要試圖非常規,而應該像平常一樣for (int i = 0; i < b.length(); i++)
  2. 您的指數計算不會環繞負數。一個簡單的方法來解決它是模前增加b.length()(i + b.length() - amount) % b.length()

最後,雖然這不是一個錯誤,通常的方式來遍歷一個BitSet是使用nextSetBit,而不是去對所有的索引。

總之,它會看起來像這樣:

BitSet result = new BitSet(b.length()); 

for (int i = b.nextSetBit(0); i != -1; i = b.nextSetBit(i + 1)) { 
    int j = (i + b.length() - amount) % b.length(); // new index after wrapping 
    result.set(j); 
} 
return result; 
+0

好吧,所以我嘗試了你給我的,並給出了C1的正確左移,而不是D1。 – user3614496

+0

C:1111000011001100101010101111 d:0101010101100110011110001111 C1:1110000110011001010101011111 D1:101010101100110011110001111 – user3614496

+0

它似乎是b.nextSetBit(0);它在D1上失敗,因爲第一位不是1,因此它完全跳過它。 – user3614496