【OI】位運算操做

1、基礎操做it

1.a<<b基礎

將二進制a左移b位,不夠的地方用0補位原理

例如進階

100<<2 == 10000二進制

 

2.a>>b集合

將二進制a右移b位移動

例如

100>>2 == 1

 

3.a|b

或操做(按位或),相同位中只要有一個1或者兩個1則結果爲1,全0則結果爲0

 

4.a&b

與操做(按位與),相同位中只要都是1,則結果爲1,若是一個爲0一個爲1或者都是0則結果爲0。

 

5.a^b

異或,相同位只要一個1一個0,則結果爲1;相同位二進制相同則結果爲0 。

 

2、進階操做

 

1.快速求2^n

1<<n == pow(2,n)

原理:1<<n的意思是1的二進制向左移動n位,則此數二進制形式變成了 100000...000(n個0),剛好是2^n

 

2.判斷奇數偶數

n&1 == 1則爲奇數

n&1 == 0則爲偶數

原理:n&1的意思是n與1,那麼n與1中,1除了右端位爲1其餘位都是0,則由與運算獲得的結果中其餘位一定都是0 。

因此最後獲得的結果只與1的右端位和n的右端位有關,咱們知道1的右端位爲1,那麼n的右端位只有爲1的時候與1進行與運算的結果是1;n的右端位只有爲0的時候與1進行與運算的結果是0 。

顯然二進制右端位爲1的時候該數爲奇數,爲0時該數爲偶數,因此得證。

 

3.lowbit

a&(-a) 表明着a的二進制的最後一位。

原理:涉及到二進制的補碼知識,感興趣的人能夠本身瞭解。

 

3、高階操做

1.a >> b & 1 表明着若是a的第b位爲1則爲真

用來判斷二進制的某一位

原理:a左移b位,則a的右端位就是原來a的第b位,這時與1作與運算(1左邊的0由與運算性質得沒有影響)就能夠得知這一位是1仍是0(1&1 == 1,0|1 == 0 )

 

2.a|(1<<n) 表明着將a的二進制的第n位設爲1

原理:1<<n能夠看做由一個1和n個0組成的二進制數,其中0的部分由或的性質(0|0==0,1|0==1)能夠知道不會對二進制位產生影響。

而1的部分由或的性質(1|1==1,0|1=1)能夠得出必定是1。 

 

4、圖論

x表示要判斷的點,S表示集合

(1 << x) & S == true 即x在S集合裏,若是爲false則x不在S集合裏 

S = S | (1 << x) 表示S集合中加入了x點 

相關文章
相關標籤/搜索