0

我对用 Java 编写这个 C 代码很感兴趣:

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

但是,看起来 java 不能传递地址,那么有什么干净的方法呢?

我想到了两种方法,但我想知道是否有更好的方法来做到这一点?

方法一:使用数组

 // 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);
}
4

3 回答 3

8

不,没有更好的方法来做到这一点......

除非你想用传统的 Java 方式来做,那就是

d = setBit(d, i);

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

这就是说在 Java 中“修改函数的参数”几乎本质上是不干净的。干净的方法是找到一些替代方法来修改参数。

(有时这是不可避免的,在这种情况下,您的解决方法就是要走的路。也就是说,如果您想编写一个方法modify(myData),通常最好将一个modify()方法添加到myData的类。)

于 2012-07-02T22:35:38.837 回答
3

int setBit(int n, int i)which 返回具有给定位集的新 int怎么样?

或者,您可以将其封装在一个名为 IntBuilder 或类似的类中:

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

这只有在您还想执行其他操作时才真正有意义。只是设置一点,这是矫枉过正的。

于 2012-07-02T22:35:52.317 回答
0

不是一般方法,但在您的特定情况下,我建议使用可变整数。apache-commons-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...。(虽然有时候确实是这样……)

于 2012-07-02T23:28:43.007 回答