按位或與加法有什麼區別?
拿PHP語言為例:
1|2=3 1+2=32|4=6 2+4=64|8=12 4+8=12
如果都是2的N次方的話,可以理解為 按位或與加法一樣么?也就是「+」與「|」通用。
按位(bitwise)就是指各個位的運算都是獨立的,而加法不是按位運算,每個位相加時都可能會進位,只是問題描述里的都剛好不需進位而已。
其實按照這樣推論的話,異或也和加法有關,結果也是一樣的:
1|2=3 1+2=3 1^2=3
2|4=6 2+4=6 2^4=6
4|8=12 4+8=12 4^8=12
如果仔細看下這三個例子,就會發現它們的共同點,那就是每一位的加法都不會產生進位:
如果發生進位會發生什麼?反正 2 + 3 = 5,但 2 | 3 = 3、2 ^ 3 = 1,完全不同。
我們從最簡單的情況看起,一位數的加法(當然這裡的指的是二進位的一位):
+ 0 1
0 00 01
1 01 10
如果單獨拆開看當前位(S)和進位位(C),就可以發現熟悉的東西了:
S 0 1 C 0 1
0 0 1 0 0 0
1 1 0 1 0 1
你看,如果是一位數加法,當前位的結果表和「按位異或」的真值表是一樣的,進位位的結果表和「按位與」是一樣的。
0 ^ 0 = 0 0 0 = 0
0 ^ 1 = 1 0 1 = 0
1 ^ 0 = 1 1 0 = 0
1 ^ 1 = 0 1 1 = 1
好了,恭喜你重新發現了人類歷史上的重要發明:半加器~
啊貼錯圖了,恭喜你重新發現了人類歷史上的重要發明:半加器~
如果你把兩個半加器和一個或門組合起來,就是正常的全加器,可以做所謂的「加法」了。
p.s. 因為「異或」確實可以表達成「與」「或」「非」的組合,嘛~「按位或」確實和「加法」有那麼點關係呢~
你都挑2的x次方,當然位或和加法是一樣的了!
位或本質上是不帶進位的二進位加法,你的例子都不用進位,結果當然和加法是一樣的。
你來個3|3=3,每一位都進位,還跟3+3一樣嗎?對於非負整數(定義得當的話負數和非整數也可以) x 和 y 有 x + y == (x | y) + (x y) 。我想你應該可以體會下有什麼區別。
計算機的數據本質是0與1
計算機的數學本質是位的與或非
你所舉例子的本質是巧合
至於加法,它是根據按位操作實現的
如果你有興趣,可以自己推導一下下面的圖
32位超前進位加法器的設計 | Imagination中文技術社區
推薦閱讀:
※如何利用python讀取特定目錄下的特定文件的倒數兩行?
※鵝苗防治鵝群的免疫程序及疫病防治方法
※結婚時省了的程序,可能會影響婚後幸福
※n個球放入m個盒子,使用程序輸出所有的放法?
※想從事遊戲製作/設計行業,需要學哪些編程語言?
TAG:程序 |