Javaには論理AND演算子があります。
Javaには論理OR演算子があります。
Javaには論理否定演算子があります。
Javaには論理的なXOR演算子がありません Sunによると 。定義したいのですが。
方法としては、単に次のように定義されています。
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
このメソッドは次のように呼び出されます。
boolean myVal = logicalXOR(x, y);
以下のようにして、私はむしろ演算子が欲しいです。
boolean myVal = x ^^ y;
Javaで新しい演算子を定義する方法について私は何も見つけることができません。どこから始めればいいですか。
Javaは論理的なXOR演算子を持っています、それは ^ です( a ^ b
).
それ以外に、Javaでは新しい演算子を定義できません。
編集:これが例です:
public static void main(String[] args) {
boolean[] all = { false, true };
for (boolean a : all) {
for (boolean b: all) {
boolean c = a ^ b;
System.out.println(a + " ^ " + b + " = " + c);
}
}
}
出力:
false ^ false = false false ^ true = true true ^ false = true true ^ true = false
X!= yではありませんか。
Javaには論理AND演算子があります。
Javaには論理OR演算子があります。
違う。
Javaは持っています
短絡評価は不可能なので、XORは^としてのみ存在します。
おそらく、&
と&&
、|
と||
の違いを誤解しています。ショートカット演算子&&
および||
の目的は、最初のオペランドの値によって結果が決まるため、2番目のオペランドを評価する必要がないことです。
これは、2番目のオペランドがエラーになる場合に特に便利です。例えば.
if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)
ただし、XORを使用すると、結果を取得するために常に2番目のオペランドを評価する必要があるため、意味のある操作は^
だけです。
(a!=b)
と書くだけです
これはa ^ b
と同じように機能します。
これは、演算子のオーバーロードが故意に言語から除外されているためです。彼らは文字列の連結でちょっと「だました」が、それを超えると、そのような機能は存在しない。
(免責事項:私はJavaの最後の2つのメジャーリリースで作業していないので、もしそれが今であれば、私は非常に驚きます)
次のコード
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
余計です。
なぜ書きませんか:
public static boolean logicalXOR(boolean x, boolean y) {
return x != y;
}
?
また、javashlook 言った として、既に^
演算子があります。
!=
と^
は、ブール値のオペランド(あなたの場合)に対しては*同じように動作しますが、整数オペランドに対しては異なります。
* ノート:
1。これらはboolean
(プリミティブ型)に対しても同じように機能しますが、Boolean
(オブジェクト型)オペランドに対しては機能しません。 Boolean
(オブジェクトタイプ)の値は、値null
を持つことができます。また、!=
は、そのオペランドの一方または両方がfalse
の場合はtrue
またはnull
を返します。この場合、^
はNullPointerException
をスローします。
2。それらは同じように働くが、それらは異なる優先順位を有する。 &
と共に使用すると、a & b != c & d
はa & (b != c) & d
として扱われますが、a & b ^ c & d
は(a & b) ^ (c & d)
として扱われます(offtopic:ouch、Cスタイルの優先順位表は吸います)。
Javaにおける唯一の演算子オーバーロードは、文字列に対する+( JLS 15.18.1文字列連結演算子+ )です。
コミュニティは何年にもわたって3つに分割されており、1/3はそれを望んでおらず、1/3はそれを望んでおり、そして1/3は気にしていません。
あなたはシンボルであるメソッド名を作成するためにunicodeを使うことができます...あなたが使いたいシンボルを持っているならあなたはmyVal = x。$(y)をすることができます。 $はシンボルでxはプリミティブではありません...しかし、これはエディタによっては扱いにくいものになり、プリミティブでは実行できないため制限されます。
これは、Java用のvar arg XORメソッドです。
public static boolean XOR(boolean... args) {
boolean r = false;
for (boolean b : args) {
r = r ^ b;
}
return r;
}
楽しい
あなたは Xtend(中置演算子と演算子オーバーロード) 演算子をオーバーロードしてJavaで「滞在」することができます
あなたが求めていることはあまり意味がありません。誤解がない限り、論理演算をANDおよびXORと同じ方法で実行するためにORを使用することをお勧めします。あなたが提供したコードは実際に私が参照しているものを示しています:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
関数にはブール値の入力があり、ブール値でXORが使用されている場合、結果は提供したコードと同じになります。言い換えれば、ビットごとのXORは、個々のビット(ブール値)を比較するとき、または個々のビットをより大きな値で比較するときにはすでに効率的です。これをコンテキストに入れると、バイナリ値に関しては、ゼロ以外の値はTRUEで、ZEROのみが偽です。
したがって、XORを論理ANDの適用方法と同じ方法で適用するには、1ビットのバイナリ値のみを使用するか(同じ結果と効率を得るため)、またはバイナリ値をビットごとではなく全体。言い換えれば、式は(010 ^^ 110)= 100の代わりに(010 ^^ 110)= FALSEとなります。これは、操作から意味上の意味の大部分を取り除きます。
Javaにおける論理排他的論理和は!=
と呼ばれます。友達を混乱させたい場合は^
を使用することもできます。
私はとても人気のあるクラス "org.Apache.commons.lang.BooleanUtils"を使っています。
この方法は多くのユーザーによってテストされており、安全です。楽しむ。使用法:
boolean result =BooleanUtils.xor(new boolean[]{true,false});
AとBは、真理値表が同じに見えるように、!= xorと同じにするためにブール値にする必要があります。 !(A == B)を使用することもできます。
これが例です:
2つのint値が与えられた場合、1が負で1が正の場合にtrueを返します。パラメータ "negative"がtrueの場合を除き、両方が負の場合にのみtrueを返します。
public boolean posNeg(int a, int b, boolean negative) {
if(!negative){
return (a>0 && b<0)^(b>0 && a<0);
}
else return (a<0 && b<0);
}
ブールデータ型は整数のように格納されるため、ビット演算子^は、ブール値と共に使用するとXOR操作のように機能します。
//©Mfpl - XOR_Test.Java
public class XOR_Test {
public static void main (String args[]) {
boolean a,b;
a=false; b=false;
System.out.println("a=false; b=false; -> " + (a^b));
a=false; b=true;
System.out.println("a=false; b=true; -> " + (a^b));
a=true; b=false;
System.out.println("a=true; b=false; -> " + (a^b));
a=true; b=true;
System.out.println("a=true; b=true; -> " + (a^b));
/* output of this program:
a=false; b=false; -> false
a=false; b=true; -> true
a=true; b=false; -> true
a=true; b=true; -> false
*/
}
}
あなた自身の演算子を実装するためにScalaに切り替える必要があるでしょう