位運算的4個例題

2021-09-27 03:26:27 字數 1474 閱讀 9529

例題1、尋找獨一無二的數

解答:利用位運算異或的性質:a^a=0,a^0=a,a^b^c=(a^b)^c=a^(b^c)

資料規模100萬,不能用o(n^2),應該用o(n)演算法,邊讀取邊處理。

例題2:為了未來的計算機

解答:方法

一、利用位運算且的性質:a&(1《方法

二、利用位運算且的性質:a&(a-1)可以將a的最右邊的1變成0。

錯誤解法:利用(a>>i)&1判斷a的第i位是不是1。

錯在原因:有符號數右移,最高位補0或1,由編譯系統決定。devc++5.5.3測試-1>>1的結果是-1

例題3、高低位交換

解答:利用位運算且的性質與位運算或的性質,結果為((a&0xffff0000)>>16) | ((a&0x0000ffff)<<16)。注意,用unsigned int,不要用int。當然直接用long long也是沒有問題的,但還是建議用前者,這樣對位運算的把握會更好。

例題4、求和

解答:利用位運算性質 a | b = (a&b) + (a^b)。證明:用0,1進行證明單獨一位上成立,從而對整個整數也成立。而計算某位上a | b的值取決於這一位上1的個數。所以我們要事先統計出這一位上0的個數,假設有x個,而共有n個數,則這一位兩兩取數進行行位運算或 | 的計算值為c(n,2)-c(x,2)——涉及排列組合知識,類似於如1,2,3,4組成沒有重複數字的4位數的所有數的和為多少。

例題1方法一ac**:

#include#include#includeusing namespace std;

int n,x,ans;

int main()

printf("%d\n",ans);

}return 0;

}

例題2方法一ac**:

#include#includeusing namespace std;

int n,x,ans,cnt=0;

int main()

}printf("case #%d: %d\n",++cnt,ans);

}return 0;

}

例題2方法二ac**:

#include#includeusing namespace std;

int n,x,ans,cnt=0;

int main()

例題4ac**:

#include#include#includeusing namespace std;

int a;

long long n,zr[21],ans;

int main()

}int m=1;

for(int j=0;j<=15;j++)

printf("%lld\n",ans);

return 0;

}

位運算的乙個例子

原題 題解 狀壓樸素 也就是用二進位制代替布林陣列,然後樸素地給出 include using namespace std int main return 0 對while語句的解釋 運算順序 算術運算 移位運算 位運算 邏輯運算 p 10是p的個位數字,當每次進入while迴圈時,認為此時游標總是...

演算法與位運算例題

題目 輸入乙個32位的整數a,使用按位異或 運算,生成乙個新的32位整數b,使得該整數b的每一位等於原整數a中該位左右兩邊兩個bit位的異或結果 include int main int t,i,c int b 1,j 1 int a 32 int p 32 printf please input ...

單調棧 四個例題

普通棧就5個操作 include0.stack 型別 名字 建立 1.名字.push 元素 壓入棧變為新的棧頂 2.m 名字.top 獲取棧頂元素 3.名字.pop 彈出棧頂元素 4.length 名字.size 獲取棧內元素長度ps 對於 順序棧和鏈棧 相對於普通棧來說 效率會相對高一點 普通棧考...