首先,先來介紹一下關於位運算中的
異或:若參加運算的兩個二進位制位值相同則為0,否則為1下面是異或運算的三個性質
交換律:a ^ b ^ c <=> a ^ c ^ b
任何數與0異或 0 ^ n = n
相同的數異或為0 n ^ n => 0
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
class solution
return ans;
}};
以後的 swap 函式也可以比別人寫得更有格調了
int32_t main()
{ ios;
int x,y;
while(cin>>x>>y){
cout<<"原來的數: "<**解釋:
我們從 y=x^y 開始說起,經過上面的 x=x^y (我們記為 1式) 操作後,
現在的 y 變成了 y=x^y^y(將 x 帶入 1 式)=x, 而下一步 x=x^y=x^y^x (將 x 帶入 1 式)= y
關於異或下面還有一道例題,請讀者選擇**:
與運算大家接觸的應該比較多了而或運算
位運算的速度很快,下面用乙個例子來說明:
int32_t main()
{ ios;
while(cin>>n){
if(n&1) cout<<"這是個奇數"《這樣的操作和 n%2 比起來,不知道快多少,n%2 是計算出餘數,而 n&1 則只是看最後一位
因為 2 的指數次冪的二進位制形式全為 100000 的形式,
那麼 ,這個數減一后的二進位制形式為 11111(此時 1 的個數是原來這個數中 0 的個數)
int32_t main()
{ ios;
while(cin>>n){
if(n>0&&(n&(n-1))==0) cout<<"yes"<>n>>k){
if((n>> k-1 )&1) cout<<"yes"《將乙個數的各二進位制位右移(k-1)位,移到右端的低位被捨棄,對於無符號數, 高位補0
例如:(n《用來將乙個數 n 的各二進位制位全部左移 n 位,低位補0位運算奇技淫巧
位操作符 與運算 兩個位都是 1 時,結果才為 1,否則為 0,如 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 或運算 兩個位都是 0 時,結果才為 0,否則為 1,如 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 異或運算,兩個位相同則為 0,不同則為 1,如 1 0...
位運算有什麼奇技淫巧?
計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位運算就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率非常高,在程式中盡量使用位運算進行操作,這會大大提高程式的效能。int a 8 a 3 移位前 0000 0000 0000 0000 0000 0000 0000 1000 移位...
位運算的奇技淫巧 系列1
以下內容就不講位運算的基礎了,需要複習位運算的同學,可以參考我的以下文章 位運算基礎 位運算例子 為什麼要介紹位運算呢?位運算更符合計算機的執行方式,即使是用c,c j a,python,vb,等程式語言,到最後都會被變成二進位制檔案,讓運算器進行位運算。因此,我們幫計算機做好了識別符號的轉換,這樣...