位運算的奇巧淫技

2022-08-22 09:21:07 字數 2569 閱讀 3140

1.在處理整形數值時,可以直接對組成整形數值的各個位進行操作。這意味著可以使用遮蔽技術獲得整數中的各個位。

2.&(與)、|(或)、^(異或)、~(非/取反)。

3.>>和《運算子將二進位制位進行右移或者左移操作。

4.>>>運算子將用0填充高位;>>運算子用符號位填充高位,沒有《運算子。

5.對於int型,1<<35與1<<3是相同的,而左邊的運算元是long型時需對右側運算元模64。

6.與:都為1結果為1;或:有乙個為1結果為1,;異或:二者不同時結果為1。

1.判斷奇偶數:x&1=1則x是奇數,x&1=0則x是偶數。

2.獲取二進位制位是1還是0:x&某乙個奇數之後再右移相應的位數。

3.交換兩個整數變數的值。

4.不用判斷語句,求整數的絕對值。

異或:可以理解為不進製加法:1+1=0,0+0=0,1+0=1。

1.交換律可以交換運算因子的位置,結果不變。

2.結合律(即(a ^ b ) ^ c = = a ^ ( b ^ c ) )

3.對於任何數x,都有x ^ x = 0 , x ^ 0 = x ,同自己求異或為0,同0求異或為自己。

4.自反性a ^ b ^ b = a ^ 0 = a,連續和同乙個因子做異或運算,最終結果為自己。

1-1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

連續異或,消除重複。

#include

using namespace std;

intmain()

;for

(int i =

1; i <=9;

++i) x=x^i;

for(

int j =

0; j <10;

++j) x=x^test[j]

; cout<

return0;

}

乙個陣列裡處理某乙個數之外,其他的數字都出現了兩次。請寫程式找出這個只出現一次的數字。

連續異或,消除重複。

#include

using namespace std;

intmain()

;for

(int j =

0; j <11;

++j) x=x^test[j]

; cout<

return0;

}

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中的1的個數。

例:9的二進位制表示為1001,有2位是1.

1.整數x與1,然後將1迴圈左移32次;

2.整數x與1,然後將x迴圈右移32次;

3.x&(x-1)可以消掉最右邊的1,直到x=0。

#include

using namespace std;

intmain()

#include

using namespace std;

intmain()

#include

using namespace std;

intmain()

cout<

return0;

}

用一條語句判斷乙個整數是不是2的整數次方。

2的整數次方說明x中只有乙個1,x&(x-1)可以消掉最右邊的1。

#include

using namespace std;

intmain()

輸入乙個整數,將其二進位制形式的奇偶位置數互換。

乙個數&(0101)×8得到的是它的所有奇數字數字,&(1010)×8得到的是它所有偶數字數字,然後分別左移和右移之後再異或一下,得到的就是奇偶位互換的數字。

#include

using namespace std;

intmain()

給定乙個介於0和1之間的實數,(如0.625),型別為double,列印它的二進位制表示(0.101,因為小數點後的二進位制分別表示0.5,0.25,0.123…)。

如果該數字無法精確地用32位以內的二進位制表示,則列印「error」

浮點數轉換為二進位制的方式為乘2挪整。

#include

#include

using namespace std;

intmain()

else

len++;if

(len>32)

} cout<<

"0."

<

return0;

}

陣列中只有乙個數出現了1次,其它的數都出現了k次,請輸出只出現了1次的數。

k個相同的k進製數做不進製加法結果為0。

一 位運算的奇巧淫技

補充 異或,可以理解為不進製加法 1 1 0,0 0 0,1 0 1 性質 1 交換律,可任意交換運算因子的位置,結果不變 2 結合律 即 a b c a b c 3 對於任何數x,都有x x 0,x 0 x 4 自反性a b b a 0 a,連續和同乙個因子做異或運算,最終結果為自己 題1 找出唯...

貪心的奇巧淫技 Join the Strings

題目大意 已知n個長度不同的字串,求字典序最小的方案.分析 直接貪心是不對的,因為按字典序排序的話會出現這種情況 bt,btb,此時直接貪心就成了btbtb,明顯btbbt更優.所以按 a b,b a 判斷就可以了 機智 code include include include include in...

演算法很美第一章 位運算的奇巧淫技

知識點 a a 0 a 0 a 乙個數與0進行按位異或,結果是他自己 對乙個序列進行按位異或,可以消除掉序列中的重複項,比如 a a b c c b 根據第1 2條規則 對乙個序列補一下,就可以將不重複的元素變成重複的元素,重複的元素變成不重複的,從而可以找到原本序列中重複項。比如原本是 a b c...