實用技巧
位運算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了)
例2:int n;
cin>>n;
int a[n+1]
;a[0]
=0;for
(int i=
1;i<=n;i++
)cout<;
乙個陣列中有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裡少數大受歡迎的文章之一,很多人都希望我能不斷完善那篇文章。後來我看到了不少其它的資料,學習到了更多關於位運算的知識,有了重新整理位運算技巧的想法。從今天起我就開始寫這一系列...