位運算的巧妙應用

2021-09-06 10:31:24 字數 996 閱讀 3480

與運算:&

或運算:|

異或運算:^

非運算:~

移位運算:>>和<<

題目要求:用乙個表示式,判斷乙個數x是否是2的n次方,即2,4,8,16……等,要求不可以用迴圈語句。

解析:2,4,8,16這樣的數轉化成二進位制是10,100,1000,10000。

如果x減去1後(低一位並且二進位制的每一位都是1),這個數與x做與運算,答案若是0,則x是2的n次方。

所以答案是:!(x&(x-1))

題目要求:將a,b兩個數的值進行交換,並且不使用任何的中間變數。

解法1:

a = a+b;

b = a-b;

a = a-b;

這樣做的缺點就是如果a,b都是比較大的兩個數,a = a+b;時就會越界。

解法2:採用異或位運算。

異或運算:相同為0,相異為1。

a = a^b;

//a變為乙個相同為0,相異為1的結果

b = a^b;

//該結果和b做運算,得到原來的a

a = a^b;

//該結果和a做運算,得到原來的b

這裡稍微有點繞,我來詳細解釋一下:

首先,兩個數做異或運算,得到乙個結果,這個結果中,原來兩個數相同的位被置為0,相異的位被置為1;

然後,這個結果和原來的b做異或運算,對每一位來說:

if(結果位為1)

else

}if(結果位為0)

else

}

所以這個結果和原來的乙個數做異或運算可以得到另乙個數。

《程式設計師面試寶典 第三版》第二部分 c++ 程式設計基本概念

巧妙運用位運算

本文旨在通過兩道巧妙運用位運算的題,認識位運算的魅力 題意 給定兩個序列 a,b 求 a,b 的最長公共子串行 a b le 10 5 時限 5s 目前求任意兩序列的最長公共子串行,是沒有複雜度低於 o a cdot b 的演算法的 回顧經典的 o a cdot b f max f f f a i ...

位運算的巧妙設計

位運算子 例子名稱 結果 a b and 按位與 將把 a 和 b 中都為 1 的位設為 1。a b or 按位或 將把 a 和 b 中任何乙個為 1 的位設為 1。a b xor 按位異或 將把 a 和 b 中乙個為 1 另乙個為 0 的位設為 1。a not 按位取反 將 a 中為 0 的位設為...

面試題之位運算的巧妙應用

1 判斷乙個數是否是2的n次方 題目要求 用乙個表示式,判斷乙個數x是否是2的n次方,即2,4,8,16 等,要求不可以用迴圈語句。解析 2,4,8,16這樣的數轉化成二進位制是10,100,1000,10000。如果x減去1後 低一位並且二進位制的每一位都是1 這個數與x做與運算,答案若是0,則x...