2012-07-02 24 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...开头的答案。 (虽然有时确实如此......)

相关问题