2012-07-02 27 views
0

我很感興趣,在Java中這樣做的C代碼:什麼是乾淨的方式來修改java中的函數內的參數?

// sets n's ith bit from right, i starts from 0 
void setBit(int* n, int i){ 
    *n = *n | (1 << i); 
} 

但是,它看起來像Java不能通過地址,所以這將是一些清潔方法?

我想到了兩種方法,但我想知道是否有更好的方法來做到這一點?

方法1:使用數組

// sets n[0]'s ith bit from right, i starts from 0 
public void setBit(int[] n, int i){ 
    n[0] = n[0] | (1 << i); 
} 

方法2:使用一個類

private class Data{ 
    int value; 
} 

// sets d.value's ith bit from right, i starts from 0 
public void setBit(Data d, int i){ 
    d.value = d.value | (1 << i); 
} 
+1

「我想知道是否有更好的方法來做到這一點? - 沒有。 –

+0

感謝Sam,我甚至沒有注意到這個功能! – Popcorn

+0

是否有任何理由不使用'BitSet'來設置位? –

回答

8

不,沒有更好的辦法來做到這一點...

除非你想做到這一點的傳統Java方式,即

d = setBit(d, i); 

public int setBit(int d, int i) { 
    return d | (1 << i); 
} 

在Java中這就是所謂的「修改參數到一個函數」幾乎是固有不潔。乾淨的方法是找到一些替代修改參數。

(有時它會是必然的,在這種情況下,你的解決方法是要走的路。這就是說,如果你想寫一個方法modify(myData),這是經常更好的modify()方法添加到myData的課。)

+1

看起來我們在同一分鐘內回答*完全相同。我正在刪除我的答案,因爲我更喜歡將'd'的變量命名爲'n'。再見10點*嗅探*。 – Joe

3

int setBit(int n, int i)如何返回一個新的int與給定的位集?

或者,你可以在一個名爲IntBuilder類或類似的東西封裝這個:

IntBuilder ib = new IntBuilder(); 
ib.setBit(n); 
int i = ib.getInt(); 

這隻會真正意義,如果你有你也想執行其他操作。只是設置一點點,這是過度殺傷。

0

不是一般的方法,但在你的特定情況下,我會建議使用可變整數。在Apache的公地lang3包包含一個很好的實現作爲org.apache.commons.lang3.mutable.MutableInt

http://commons.apache.org/lang/api-release/index.html

的.setValue()方法可以讓你實現你的方法有點C風格的方式。

ps:我不喜歡以Nope, no better way to do it...開頭的答案。 (雖然有時確實如此......)

相關問題