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 はアドレスを渡すことができないようです。

2つのアプローチを考えましたが、もっと良い方法があるかどうか疑問に思っていましたか?

アプローチ 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);
}
4

3 に答える 3

8

いいえ、それを行うより良い方法はありません...

従来の Java の方法でそれを行いたくない場合を除きます。

d = setBit(d, i);

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

Java では、「関数の引数を変更する」ことはほとんど本質的に汚れていると言えます。きれいな方法は、引数を変更する代わりの方法を見つけることです。

(避けられない場合もあります。その場合は、回避策を講じる必要があります。とは言っても、 method を書きたい場合は、メソッドをのクラスmodify(myData)に追加する方がよい場合がよくあります。)modify()myData

于 2012-07-02T22:35:38.837 に答える
3

int setBit(int n, int i)指定されたビットが設定された新しい 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 に答える