為什麼大多數編程語言只有異或運算符而沒有同或運算符?
一般也沒有 NAND、NOR 啊,一視同仁沒有 XNOR 很合理吧。記得以前一些 Basic 方言還有 IMP 呢,現在常用的語言都沒有這個了。
再反對 @丁果 ,誇一下我精湛的P圖技術我就原諒你╭(╯^╰)╮
原答案:
反對一下奇偶校驗的說法。兩種運算,本質上都是二階循環群上的運算。異或的幺元是0,生成元是1;同或的幺元是1,生成元是0。
n階循環群同構於模n的加法群
where ,所以同或也能實現奇偶校驗:
一串bit異或 = if 奇數個1 then 1 else 0一串bit同或 = if 奇數個0 then 0 else 1在不是0就是1,不是奇數就是偶數的前提下兩個能達到的效果是一樣的。
要說理由可能就是人的直覺上覺得0更適合當幺元,尤其是同構到加法群之後加法群的幺元就是0。其實它也同構於這個由1和-1組成的乘法群,這個群里1是幺元。
where
就如同為什麼用高電平表示1低電平表示0,而不用低電平表示1高電平表示0;為什麼1表示真0表示假,而不是0表示真1表示假。
現在的處理器基本都提供異或指令,很少提供同或指令,雖然老一代為什麼這麼設計不得而知,但是現在再加上同或指令的話肯定沒人用:取個反很快,不差這一個周期,而用了這條指令就和老版本處理器不兼容了。1、沒那麼多字元2、有非運算符
異或...0 10 0 1 1 1 0大概是這麼個樣子……唔。。。
同或的話是不是給人一種一一得一,-1乘-1負負得正的感覺?
同或。。和相等有什麼區別。
補充:有同學說有區別,不過舉那個unsigned和bool的例子不合適吧,畢竟不在同一個定義域下的運算沒有可比性啊,這裡的等於(=)當然和異或(^)一樣是位(bit)級別的咯。放開讓我來,感覺這題我能裝B,答案是因為電路上異或比同或要省幾個管子。請翻開《電子技術基礎(數字部分)》,沒書的看下圖:同或門的實現比異或門要多兩個mos管。兩個管子的差距可能現在大家覺得沒啥,在編程語言發展的初期可能電路實現得靠傻大黑粗的電子管呢,這個差別就大了。這個可能就是在編程語言發展的過程中異或運算符的保留程度要高些吧。這個是在遙遠的本科時期焊板子搞電賽的時候發現的,當時發現的是為啥與非門和或非門比單純的與和或的晶元好找。這些都是憑記憶寫的,現在早轉CS了,哪位數電學的好的幫我補充一下。
因為XNOR實用程度太低,專門弄一個符號不值得。AND用來清零,OR用置位,XOR用來反轉。但你能第一反應出一個XNOR使用的常見情況嗎?遇到了XOR再取非就可以了,不值得啊。同理,NAND和NOR也不值得,所以也就沒有了。
我認為這與加法器有關,在當前位上,無論是半加器或是全加器,都存在S = A ⊕ B ⊕ CI
或 S = A ⊕ B
加減乘除都可以用加法器、變補、移位來完成。同時聽知友說他們的C++開發時沒有加減乘除,只有與、或、非等等。
可見加法器的重要性。
S = A ⊕ B ⊕ CI
S = (A"B + AB")"CI +(A"B + AB")CI"
上面的比下面的容易寫多了。有異或用能減少大量的認知負擔。
並且,事實上,減法器當前位
D = M ⊕ N ⊕ B(-1)
就像與非、或非任意一個都是聯結詞完備集,但用這兩個寫式子會複雜到難以閱讀的。
而同或用處確實很少。。。。。。
猜測之言,恐有疏漏,並不充分。
明明有或和非,為啥還要與?
首先反對認為「同或」和「相等」是一回事的說法……同或指的是按位相等,如果給兩個unsigned那麼結果仍然是一個unsigned而不是bool……
C語言里一樣沒有「與非」和「或非」……與非門用得可比同或門多得多啊。。。。
畢竟,C這種設計來寫操作系統的編程語言要設計得簡單一些,一個~能解決的問題為什麼要專門定義算符……~(a^b)……
「異或」的存在可能只是為了兼容某些人拿半加器交換變數的神奇習慣吧……畢竟可以寫成a^=b;b^=a;a^=b;這種破玩意……(雖然總是得花上三個時鐘周期)
(好吧看到其他人提及了奇偶校驗。。。)
還有,VHDL等硬體描述語言總是會有相關庫定義有你想要的各類邏輯的……處理器一般不提供,這樣就算編程語言給你實現了,也只是先取反再異或而已。所以你還是去問處理器吧
異或在邏輯電路里可以用做設計奇偶校驗電路
同或,別的答主說了,確實和相等差球不多……A同或B = 非(A異或B)
同或不就是異或取非,然後不就是相等嗎
推薦閱讀: