負數以其正值的補碼形式表示
1.任何乙個數和0異或是它的本身,和自身異或為0:
a^0=a a^a=0 利用上述性質,可以用來計算2個數的交換。大家應該知道,在計算機裡,兩個數互相交換,需要定義乙個中間的變數來參與交換。如: int tmp; int a=10; int b=20; tmp=a; a=b; b=tmp; 上述**計算之後,a和b的值完成交換,a的值為20,b的值為10。 如果用異或運算來交換2個數,可以如下方法: int a=10; int b=20; a=a^b; b=a^b; a=a^b; 上述執行之後,a和b依然完成了值的交換,但由於是異或位運算,所以效率比上面的**要高。 證明:a=1020b=ab=(1020)20=102020=100=10a=ab=102010=101020=0^20=20把上述**,可以封裝為乙個交換2個數的函式如下: void swap(int *a, int *b)
2.將整數的第n位置位或清零:
#define bitn (1《n) 置位:a |= bitn; 清零:a &= ~bitn
3.清除整數a最右邊的1。
方法:a & (a – 1)//該運算將會清除掉整數a二進位制中最右邊的1。 問題:如何判斷判斷整數x的二進位制中含有多少個1? 分析:此題是微軟公司的一道筆試題。下面用&運算來解決此題。 **如下: int func(int x ) return countx; }
4.用異或運算設計乙個只有乙個指標域的雙向鍊錶:
關於位運算的一點總結:
很久之前借了學校圖書館的一本叫做演算法心得的書,看過之後感覺作者簡直神奇,不愧是大師,裡面是各種優化程式的奇淫技巧,不過那時什麼都不懂,看了覺得沒用,現在懂了一點了,然而之前看過的都忘了,裡面關於位運算的內容特別多,值得一看。
下面就是一些常見的技巧,效率都比普通運算要高很多
/1、交換兩個整數的值:int a, b;a = a ^ b;b = a ^ b;a = a ^ b;與下面的等價,不過利用的是^的重要性質,效率當然比算術運算高a = a + b;b = a - b;a = a - b;2、與2的x次方的運算int a;a <<= x;//乘2^xa >= x;//除2^xa & (1 << x) - 1 //取a%(2^x)的餘數a & 1//判斷奇偶性,為0則a為偶數,否則為奇數a & (a-1)//判斷a是否為2的冪或者0,結果為0代表是,否則代表不是3、其他常用技巧int a, b;a = ~a + 1//取相反數a = (a ^ (a >> 31)) - (a >> 31) //取絕對值(a & b) + ((a ^ b) >> 1) //取平均值a ^ b//判斷a、b符號是否相同,如果結果》0則相同,否則不同/
(1)、位運算優先順序較低,如果結合其他的運算子,那麼最好在使用時加上括號,當然如果很清楚優先順序就另當別論了。
(2)、位運算雖說高效,但是很多列舉子集的技巧資料量大點就無法使用了,所以還是得慎用,根據題目的資料範圍而定吧。
(3)、使用位運算注意細節的處理,比如說列舉子集時的起點,終點等等。
(4)、使用位運算關鍵是理解每乙個運算的特點,靈活運用它們的性質,並且找到問題與位之間的聯絡,其實上面的幾個列舉集合的技巧都是根據位之間的聯絡然後運用相應的運算子得出的,一些位運算子也有一些非常重要的特點,比如說異或運算具有交換律,結合律,自反性等等。
(5)、位運算應用很廣,體現在很多演算法和資料結構上,比如說狀態壓縮,樹狀陣列等等,在狀態壓縮中的使用通常是最常見的,很多演算法都設計到狀態之間的轉移,比如說搜尋,dp等等。有時候很難表示當前的這個狀態,但是通過二進位制位便可以解決了,所以位運算還是很方便和實用的,比如說一些在棋盤,網格中要表示某一行/列的狀態時的問題。
在資料結構中的應用最常見的是樹狀陣列,借用**上面的話:樹狀陣列的思想核心在於運用了十進位制數與二進位制數之間的聯絡,通過數的二進位制形式來決定儲存資訊,把複雜的問題簡單化,方法簡單巧妙。
樹狀陣列的優勢在於**長度短,不易出錯,思想巧妙,演算法複雜度低,維護簡單,易推廣到二維甚至三維等等。對於資料結構要求操作不複雜的題目,是上佳的選擇。
而且線段樹也涉及到了簡單的右移位運算,或運算等等。
位運算應用
位運算 針對整型 字元型,計算機會將它轉換為二進位制運算 1 按位與 x y 對應位都為1時才為1 用途 取 保留1個數的某位 對應掩碼的對應位為1 其餘各位置1 2 按位或 x y 對應位都為0才為0,否則為1 用途 將1個數的某些位置1,其餘不變 3 按位異或 x y 對應位相同為0,不同為1 ...
位運算應用
1.判斷乙個數的奇偶性。x 1 101 1 1 2.判斷x是否是2的正整數冪。x x 1 100 011 0 3.取出乙個數的某些二進位制位。3.1.x 1 d 1 10101 1 3 1 00100 取第d位 3.2.x 1 d 1 10101 1 3 1 00101 取最後d位,x對2 d取模 ...
位運算應用
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...