xor运算java_java - 使用xor运算符进行布尔检查是一种好习惯吗?
java - 使用xor運算符進行布爾檢查是一種好習慣嗎?
我個人喜歡獨家或^運算符,因為它的簡潔性在布爾檢查的上下文中是有意義的。 我更喜歡寫作
if (boolean1 ^ boolean2)
{
//do it
}
比
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
但我常常從其他有經驗的Java開發人員(不僅僅是新手)那里得到一些困惑,有時會評論它應該如何僅用于按位操作。
我很好奇關于使用^運算符的最佳實踐。
13個解決方案
289 votes
您只需使用!=即可。
vaxquis answered 2019-05-13T15:17:20Z
27 votes
我想你已經回答了自己的問題 - 如果你從別人那里得到奇怪的外表,那么選擇更明確的選項可能會更安全。
如果你需要對它進行評論,那么你最好用更詳細的版本替換它,而不是讓人們首先提出問題。
Martin answered 2019-05-13T15:17:53Z
16 votes
我發現我有很多類似的對話。 一方面,您有一種緊湊,有效的方法來實現您的目標。 另一方面,你有一些其他團隊可能無法理解的東西,使得將來很難維護。
我的一般規則是詢問所使用的技術是否是合理的,期望程序員一般都知道。 在這種情況下,我認為期望程序員知道如何使用布爾運算符是合理的,因此在if語句中使用xor是可以的。
作為一些不合適的例子,請使用xor交換兩個變量而不使用臨時變量。 這是一個我不希望每個人都熟悉的技巧,所以它不會通過代碼審查。
Dave Tarkowski answered 2019-05-13T15:18:36Z
14 votes
如果你評論它,我認為沒關系,例如// ^ == XOR。
Dre answered 2019-05-13T15:19:03Z
8 votes
你總是可以將它包裝在一個函數中,以給它一個詳細的名稱:
public static boolean XOR(boolean A, boolean B) {
return A ^ B;
}
但是,在我看來,對于那些不知道^運算符對于谷歌來說真的很快的人來說并不難。 在第一次之后不難記住。 由于您要求其他用途,因此通常使用XOR進行位屏蔽。
您還可以使用XOR在兩個變量中交換值,而不使用第三個臨時變量。
// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;
這是與XOR交換相關的Stackoverflow問題。
Cory Gross answered 2019-05-13T15:19:54Z
6 votes
我最近在一個JavaScript項目中使用了xor,最后添加了7行注釋來解釋發生了什么。 在該上下文中使用xor的理由是其中一個術語(下面示例中的term1)可能不是兩個而是三個值:undefined,true或false而另一個(term2)可能是true或false。我會 必須為undefined案例添加額外的檢查但是使用xor,以下就足夠了,因為xor強制第一個術語首先被評估為布爾值,讓undefined被視為false:
if (term1 ^ term2) { ...
最后,它有點矯枉過正,但無論如何我想把它留在那里,就像一個復活節彩蛋。
Ates Goral answered 2019-05-13T15:20:36Z
5 votes
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
恕我直言這個代碼可以簡化:
if(boolean1 != boolean2)
{
//do it
}
Y-- answered 2019-05-13T15:21:06Z
5 votes
考慮到代碼清晰度,我的觀點是在布爾檢查中使用XOR不是XOR位運算符的典型用法。 根據我的經驗,Java中的按位XOR通常用于實現掩碼flag toggle行為:
flags = flags ^ MASK;
Vipan Singla撰寫的這篇文章更詳細地解釋了用例。
如果你需要在你的例子中使用按位XOR,請評論你使用它的原因,因為它甚至可能需要一個有點文化的讀者停下來理解你使用它的原因。
Gunnar Karlsson answered 2019-05-13T15:21:56Z
-1 votes
如果使用模式證明了它,為什么不呢? 雖然您的團隊不會立即認出操作員,但他們可以隨時使用。 人類一直在學習新單詞。 為什么不在編程?
我可能唯一要注意的是“^”沒有第二次布爾檢查的短路語義。 如果你真的需要短路語義,那么靜態util方法也可以。
public static boolean xor(boolean a, boolean b) {
return (a && !b) || (b && !a);
}
Alan answered 2019-05-13T15:22:34Z
-1 votes
由于其簡潔性,我個人更喜歡“boolean1 ^ boolean2”表達式。
如果我在你的情況下(在團隊中工作),我會通過在具有描述性名稱的函數中封裝“boolean1 ^ boolean2”邏輯來達成妥協,例如“isDifferent(boolean1,boolean2)”。
例如,不要使用“boolean1 ^ boolean2”,而是像這樣調用“isDifferent(boolean1,boolean2)”:
if (isDifferent(boolean1, boolean2))
{
//do it
}
你的“isDifferent(boolean1,boolean2)”函數看起來像:
private boolean isDifferent(boolean1, boolean2)
{
return boolean1 ^ boolean2;
}
當然,這個解決方案需要使用表面上無關的函數調用,它本身受到最佳實踐的審查,但它避免了冗長(和丑陋)的表達式“(boolean1&&!boolean2)||(boolean2& amp; ;&!boolean1)“!
ONE answered 2019-05-13T15:23:34Z
-3 votes
!=可以比較兩個變量。 但是,通過多重比較,它不起作用。
answered 2019-05-13T15:24:04Z
-3 votes
str.contains("!=") ^ str.startsWith("not(")
看起來比我更好
str.contains("!=") != str.startsWith("not(")
Chris Rea answered 2019-05-13T15:24:32Z
-3 votes
作為一個按位運算符,xor比任何其他替換它的方法快得多。 因此,對于性能關鍵和可擴展的計算,xor是必不可少的。
我的主觀個人觀點:出于任何目的,絕對禁止對布爾值使用相等(==或!=)。 使用它表明缺乏基本的編程倫理和基礎知識。 任何讓你困惑的人都應該被發送回布爾代數的基礎知識(我很想在這里寫“信仰的河流”:))。
Nick answered 2019-05-13T15:25:12Z
總結
以上是生活随笔為你收集整理的xor运算java_java - 使用xor运算符进行布尔检查是一种好习惯吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java xor运算符_Java中XOR
- 下一篇: XOR运算