位運算的威力

昨天寫了篇有關集合的東西,中間用到了位運算,看起來還是有點糾結的,今天在這裏詳細解釋一下。
(歡迎轉載,轉載請註明出處,謝謝。)
一、有關位運算的基礎知識總結
位運算包括:&(與)、|(或)、^(異或)、~(取反)、>>(右移)、<<(左移)
環境預設:32位機下面,int佔2個字節,有符號
int a = 11;
int b = 1000;
(a)2 = (00000000 00001011 )2 //a的二進制表示
(b)2 = (00000011 11101000 )2 //b的二進制表示
a&b =(00000000 00001000 )2 =(8)10 //一一爲一,其它爲0
a|b = (00000011 11101011 )2 =(1003)10 //有一爲一,零零爲0
a^b = (00000011 11100011 )2 =(995)10 //相同爲0,不相同爲1
~b = (11111100 00010111 )2 =(-31767)10 //按位取反
b>>3 = (00000000 01111101 )2 =(125)10 // 去掉低3位,高位補0
或 = (11100000 01111101 )2 =(-24701)10 //去掉低3位,高位補1 補0還是1具體情況視編譯環境決定
a<<3 = (00000000 01011000 )2 =(88)10 //去掉高3位,低位補0

看了上面的例子,相信你已經明白具體規則了,不明白自己去google。下面講具體作用。
位運算應用口訣

清零取數要用與,某位置一可用或
若要取反和交換,輕輕鬆鬆用異或

例1.子網掩碼
子網掩碼是個啥東東我也就不講了,計算機科學技術本身就是個非常龐大系統,一個人不可能面面俱到,但是一些基本的嘗試還是要懂的,不懂的可以自己去google,也可以等我的相關網絡方面的文章。這裏只講與本問有關的應用部分。
假如我是一個網管,公司內部使用C類地址,現在我要把公司網絡劃分成5個子網,網絡號爲192.168.1.0的前三段,那麼子掩碼怎麼填呢?
我現在先告訴你子網的子網掩碼分別怎麼填:192.168.1.224。(當然這裏還有其他答案,我取的是在子網擴充不超過8個的情況下的每個子網所容納主機最多的最佳方案)。
這個怎麼來的呢?ip本身是個二進制的東東,爲了方便人們設置,我們採用了點分十進制的轉換,把32位的ip地址轉換成了4個字節的十進制萊表示。比如 192.168.1.213 這個ip地址的二進制表示爲:11000000 10101000 00000001 11010101 。對於C類地址默認的前三個字節表示網絡號,那麼這個網絡號就是:11000000 10101000 00000001 ,最後一個字節11010101表示主機號,可以知道這個網絡可以容納的最多主機數爲2^8-2,爲什麼減2自己去查。現在要劃分子網,那麼我們就要從表示主機的那個字節也就是8個位裏面拿出幾個位來表示子網號, 幾位比較合適呢?這就要看你需要劃分多少個子網咯。比如我們現在要劃分5個子網,(5)10 = (101)2 ,那麼至少就需要3位了,而且最多可以劃分2^3 = 8個子網。現在你把224換成二進制看看吧(224)10 = (11100000)2 ,明白了吧,我們可以推斷出子網掩碼幹了什麼勾當?不錯子網掩碼與ip地址做了按位與運算,他的作用就是屏蔽了主機號獲取網絡號與子網號。如果你明白了這點,你就知道自己在192.168.1.64子網的ip該怎麼填了,不會錯誤滴填成192.168.1.10了。
竟然扯到一邊去了,講了半天才講了一個與運算的應用。

例2. 防止int型變量溢出
int x = 32760;int y = 32762; 要求求x、y的平均值,要求空間複雜度位O(0)。
你能用常規方法去解決嗎?可以。我不會講,這裏只講位運算的 方法。
int ave(int x, int y) //返回X、Y的平均值
{
return (x & y) + ( (x^y)>>1 );
}
知識點:>>n 相當於除於2^n ,<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章