實用技巧之位運算

2021-10-05 10:31:06 字數 1559 閱讀 5728

實用技巧

位運算1(十進位制)=01(二進位制)

&

兩個二進位製碼位置如果同時是1則結果為1,其餘為0

b&1所以「&1」「%2」是判斷奇偶的,是奇數則為1

>>

右移運算

1.二進位製碼向右挪x個長度,右邊擠掉

2.可以取出二進位制表示下的某一位,例如:n^(1<>=1

「>>1」=除二

b>>x就可以取出b的二進位製碼中的第x位

(x是乙個數字)

b&1可以取出b在二進位制表示下的最低位

b>>1可以捨去最低位

<<

左移運算

1<2的b次方

常用long long len = 1 ll<<(n-1);

long long cnt = 1 ll<< (2*n-2);

注意型別轉換

1<^

異或運算

兩個相同則為0,否則為一

1.兩個相同數異或的結果為0

2.0異或任何數都為那個數

應用:在一組數中找出不同的數

例1:乙個陣列中,只有乙個數出現了一次,請你找出這個數,其餘的都是2次

字首和+異或

將全部數異或後結果就是那個單次的數(有重複的都異或為0了)

int n;

cin>>n;

int a[n+1]

;a[0]

=0;for

(int i=

1;i<=n;i++

)cout<;

例2:

乙個陣列中有2個出現一次的數,請你求出這2數

分析

要想找出兩個單次的數,其實我們只需要將這個陣列一分為二,保證這兩部分各包含乙個出現一次的數

目標轉換:

求如何分解陣列

根據上題經驗,全部異或的結果肯定是那兩個單次數異或的結果

所以異或的結果中的二進位製碼中肯定有1

而那個1就是這兩個單次出現的數的不同之處了

於是我們記錄這個位置pos

所以我們可以依據陣列中的數的pos位置有無1來將陣列分為兩大類

分完類,做法就與例1做法一樣了

int n;

cin>>n;

int a[n+1]

;a[0]

=0;int num=0;

int a1=

0,a2=0;

for(

int i=

1;i<=n;i++

)int pos=0;

for(

int i=

0;i<

32;i++)}

for(

int i=

1;i<=n;i++

)else

}cout<" "<或運算例1給你乙個陣列,求將這個陣列的每個數組合搭配後形成小陣列,小陣列的值按位或後,有多少種不同的結果

樣例:1 1 1 2

這篇寫完,我自己都提公升了,難道不值得贊嗎???

位操作實用技巧大全

檢測乙個無符號數是不是2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 獲得最右側的0 x x 1 x 將最右側的1位改為0位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x ...

位運算簡介及實用技巧(一) 基礎篇

去年年底寫的關於位運算的日誌是這個blog裡少數大受歡迎的文章之一,很多人都希望我能不斷完善那篇文章。後來我看到了不少其它的資料,學習到了更多關於位運算的知識,有了重新整理位運算技巧的想法。從今天起我就開始寫這一系列位運算講解文章,與其說是原來那篇文章的follow up,不如說是乙個remake。...

位運算簡介及實用技巧(一) 基礎篇

轉於http www.matrix67.com blog archives 263 去年年底寫的關於位運算的日誌是這個blog裡少數大受歡迎的文章之一,很多人都希望我能不斷完善那篇文章。後來我看到了不少其它的資料,學習到了更多關於位運算的知識,有了重新整理位運算技巧的想法。從今天起我就開始寫這一系列...