2011-08-19 58 views
0

在這裏表示使用二進制整數的問題是:在java語言

你給定的2個32位數字,N & M和2位的位置,我&Ĵ。寫來設置於N等於M i和j之間的所有位的方法

例如(例如,M處我 定位和與j開始成爲N的子串): 輸入: INT N =百億, M = 10101,i = 2,j = 6; 輸出: INT N = 10001010100

我的解決辦法:

step 1: compose one mask to clear sets from i to j in N 
mask= (((((1<<(31-j))-1) << (j-i+1)) + 1) << i ) - 1 
for the example, we have 
     mask= 11...10000011 
step 2: 
     (N & mask) | (M<<i) 

問: 什麼是實現算法的便捷的數據類型?例如 我們在C中有int n = 0x100000,所以我們可以在n上應用按位運算符。 在Java中,我們有BitSet類,它有明確的設置方法,但不支持 左/右移運算符;如果我們使用int,它支持左/右移,但 不具有二進制表示(我不是說二進制字符串表示) 什麼是最好的實現方式?

在Java代碼中(後閱讀所有評論):

int x = Integer.parseInt("10000000000",2); 
int x = Integer.parseInt("10101",2); 
int i = 2, j = 6; 
public static int F(int x, int y, int i, int j){ 
int mask = (-1<<(j+1)) | (-1>>>(32-i)); 
return (mask & x) | (y<<i); 
}   
+0

你是什麼意思_「如果我們使用int ...但沒有二進制表示法?」_您可以絕對地將'&'和'|'應用於Java中的ints。你是說在二進制文件中編寫一個'int'文字嗎? –

+0

如果這是作業,請添加「家庭作業」標籤。 –

+0

是的,我說的是在二進制中定義一個int字面值,它類似於C語言中的這個語句:int N = 0x101010; – SecureFish

回答

3

的位運算符|&^~和十六進制文字(0x1010)都在Java中可用

32位數是int s如果仍有約束int將是有效的數據類型

順便說一句

mask = (-1<<j)|(-1>>>(32-i)); 

是面具

+1

在Java 7中甚至有一個二進制文字:' 0b1010',這可能來得方便。 –

+0

這個掩碼是非常好的,除了:想清除我和j之間的比特,這是j-i + 1比特。所以需要-1 <<(j + 1)| -1 >>>(32-i) – SecureFish

0

Java的int有你需要的所有操作的稍微清晰的結構。我並沒有完全理解你的問題(現在太累了),所以我不會給你一個完整的答案,只是一些提示。 (如果需要,我會稍後修改它。)

  • 這裏是j連續幾行:(1 << j)-1
  • 這裏是j個連續,然後是i零:((1 << j) - 1) << i
  • 這裏是一個掩碼,掩蓋了位於x:x & ~(((1 << j) - 1) << i)中間的j位置。

嘗試用Integer.toBinaryString()查看結果。 (他們也可能會給出負值或太大值的奇怪結果。)

+0

在這個問題中,我們需要(j-i + 1)個位置在x的中間 – SecureFish

0

我認爲你誤解了Java的工作原理。所有的值在引擎蓋下表示爲'一系列位',整數和長整數都包含在內。

根據您的問題,一個粗略的解決方案是:

public static int applyBits(int N, int M, int i, int j) { 
    M = M << i; // Will truncate left-most bits if too big 

    // Assuming j > i 
    for(int loopVar = i; loopVar < j; loopVar++) { 
    int bitToApply = 1 << loopVar; 
    // Set the bit in N to 0 
    N = N & ~bitToApply; 
    // Apply the bit if M has it set. 
    N = (M & bitToApply) | N; 
    } 

    return N; 
} 

我的假設是:

  • i是最右邊(最低顯著),它在N被設置位。
  • M的最右側位映射到Ni位右起。
  • 過早優化是所有邪惡的根源 - 這是O(j-i)。如果你在問題中使用了一個複雜的面具,你可以在O(1)中做到這一點,但它不會像可讀的那樣,並且可讀代碼的97%比有效代碼更重要。