備戰藍橋杯與csp 位運算

2021-10-11 01:16:58 字數 2290 閱讀 6827

資料在計算機裡以二進位制的形式存在,所謂位運算便是直接對資料在記憶體中的二進位制位進行操作.

β1. &(位與)

1 & 1 = 1

0 & 1 = 0

1 & 0 = 0

0 & 0 = 0

我們常常利用 & 運算把 0 消掉,而保持其他位的1不變,除此之外,我們還可以判斷一些數的性質,下面會提到.

a & b = 1 (當且僅當a,b均為1)

β2. |(位或)

1 | 1 = 1

0 | 1 = 1

1 | 0 = 1

0 | 0 = 0

a | b = 0 (當且僅當a,b均為0)

β3. ^(位異或)

1 ^ 1 = 1

0 ^ 1 = 0

1 ^ 0 = 0

0 ^ 0 = 1

a ^ b = 1(當且僅當a=b)

β4. << >> (位左移,位右移)
左移(aba<

0000000 00000000 00000000 01011000

30000000 00000000 00000010 11000000

88增大8倍

704右移(a>>b)

如果a為正整數, 將a帶符號向右移b位,高位補零,右移的結果為a的2^b倍.

如果a為負整數,右移的結果為a/2的b次方向上取整,具體解釋可以參考這篇文章—>傳送門

a

ba>>b

0000000 00000000 00000000 01011000

30000000 00000000 00000000 01011000

88減小8倍

1110000000 00000000 00000000 01100100

410000000 00000000 00000000 00000111

-100

減小16倍

-7對於正整數來說,左移右移的操作和乘或者除2的冪次的效果是一樣的,我們經常可以用位運算代替乘除法,因為位運算更底層,乘法和除法的本質也就是多次位運算,相比較而言,直接使用位運算速度更快.

β5. ~ (取反)

~0 = 1

~1 = 0

γ1. 判斷奇偶性(n&1)

一般我們判斷資料的奇偶性時,會通過整數能否被2整除來判斷,但從二進位制形式來看,對於乙個奇數,它的二進位制形式最後一位一定是一(最右邊一位權值為1,其他權值均為2的正整數倍),如果最右邊一位為一,它肯定不能被2整除,即為奇數,反之為偶數.

判斷乙個數二進位制形式最右邊一位是否為1可以用到 & ,對於乙個數 n,n & 1的結果便是把其最後一位取出來,我們再進行判斷0 | 1 即可

11001

&00001

——————

00001

所以在程式設計時,我們可以使用位運算來代替取餘判斷

if

(n %2==

0)if(n &1)

γ2. 快速乘,快速冪

這裡我請參考我的另一篇文章—>傳送門,大致思想就是通過位運算,將計算a*b 以及a^b的計算時間複雜度轉換為o(log(n)).

γ3. 判斷乙個數是否為2的指數冪(n&(n-1))

正常情況下我們判斷乙個數是否為2的指數冪的思路為:一直被2整除直到結果變成1或者非1奇數,這種思路的時間複雜度為o(log(n)),而使用位運算可以達到o(1)的效果.

乙個二次冪的正整數n,它的二進位制形式(不考慮儲存的位數),為最左邊乙個1,接著右邊全為0,而對於n-1,它相較於n最左邊變為0,右邊全為1,不難發現,二者相與結果為零,並且可以證明非二次冪的正整數n&(n-1)不會為0(這裡就不花費篇章證明了). n

n-1n&(n-1)

1000000

0111111

0000000

100011

100010

100011

γ4. 找出唯一乙個只出現一次的數(其他都是成對出現的)

a ^b ^b = a

如果給定我們一系列亂序的書頁碼(共n頁),讓我們從中找到,丟失的一頁,這個性質便派上了用場,我們先列舉出1-n並相異或,再和輸入的書頁碼相異或,這樣,除了丟失的頁碼只出現一次,其他頁碼均出現兩次,便得到了我們尋找的答案.

γ5. 列舉子集

備戰藍橋杯與csp 進製轉換

r指的是乙個整數,r進製的意思是指逢r進一,常見的主要有,二進位制,八進位制,十進位制,十六進製制,這些數的特點便是每一位上的數不超過r.與十進位制類似,每高一位,上面的權值也就高了r倍,所以,將r進製轉化為10進製只需要,將每一位上面的數乘以這一位代表的權重,最後相加起來,這裡使用vector來儲...

備戰藍橋杯與csp 二分查詢

二分查詢的前提是陣列是有序的 所以經常配合sort函式使用 首先找到陣列中間的值 將陣列分成左右兩部分 比較一下要查詢的數,大了就使用左邊的陣列,小了使用右邊的陣列,接著重複上面的操作,找到或者當左邊右邊重合之後停止查詢.二分查詢每一次都排除了1 2的資料,我們假設t次之後出現結果 m 條資料 那麼...

備戰CSP藍橋杯STL 入門學習queue

最簡單的佇列,具有著先進先出的特點,與桟不同,桟的特點為先進後出。在簡單演算法競賽中多用於bfs,即廣度優先搜尋。這裡記錄其與一般簡單型別,結構體,pair結合使用時的情況。queueq1 q1.push 1 q1.push 2 q1.push 3 q1.push 4 遍歷 while q1.emp...