與運算:&
或運算:|
異或運算:^
非運算:~
移位運算:>>和<<
題目要求:用乙個表示式,判斷乙個數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...