位運算的奇技淫巧

2021-10-07 03:58:00 字數 1392 閱讀 2736

首先,先來介紹一下關於位運算中的   

異或:若參加運算的兩個二進位制位值相同則為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,等程式語言,到最後都會被變成二進位制檔案,讓運算器進行位運算。因此,我們幫計算機做好了識別符號的轉換,這樣...