C 與 或 異或 取反等運算

2021-10-07 13:18:12 字數 2516 閱讀 4167

1.&按位與

2.| 按位或

3. 按位異或 ^

4.按位取反~

5.《左移

6.>>右移

應用一:

應用二:求兩數之和

求兩數之差;

位運算符號優先級別從高到低:~ & ^ |;

其中~自由向左

1.&按位與

0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

即同為1才為1;

c++輸出乙個數的二進位制; 標頭檔案#include;

如果a為int,其二進位制為:(bitset<32>(a))

如果其為long long,(bitset<64>(a))

2.| 按位或

0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1

即有乙個為1即為1;

按位異或 ^

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

即相同為0,不同為1;

int a=3;

a=a^0;//任何乙個數與0異或都為原數;

int b=3;

a=a^b;;//乙個數和另乙個相等的數異域或為0;

int c=4;

異或的另乙個用處是交換元素不用申請變數;

int a;

a=a^b;

b=b^a; //b=bab;

a=a^b; //a=ababb;

4.按位取反~

哪些為0的位,結果是1,而哪些為1的位,結果是0。例如, ~7的結果為0xfff8。

5.《左移

左移:向左移動,右補0

移動n位,則相當於原數* 2^n;

6.>>右移

向右移動,無符號左補零,有符號(整數左補0,負數左補零或1)

應用一:

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

解題思路:

首先:位運算中異或的性質:兩個相同數字異或=0,乙個數和0異或還是它本身。

當只有乙個數出現一次時,我們把陣列中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。

依照這個思路,我們來看兩個數(我們假設是ab)出現一次的陣列。我們首先還是先異或,剩下的數字肯定是a、b異或的結果,這個結果的二進位制中的1,表現的是a和b的不同的位。我們就取第乙個1所在的位數,假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。如此,相同的數肯定在乙個組,因為相同數字所有位都相同,而不同的數,肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,剩餘的兩個結果就是這兩個只出現一次的數字。

應用二:求兩數之和

不用加減乘除完成兩個數相加;

思路:& 按位與運算:相同位的兩個數字都為1,則為1;若有乙個不為1,則為0。兩個數相與,並左移一位:相當於求得進製

1&1=1 將1左移一位變成了10,相當於拿到了進製。

^ 按位異或運算:相同位置不同則為1,相同則為0。相當於每一位相加,而不考慮進製。

第一步 異或——無進製相加得result1 (a^b)

第二步 與+左移一位——求得進製result2 (a&b)<<1

第三步 result = result1 + result2即是結果

但問題在於,result1 + result2可能還有進製,因此result還要重複一二步這個過程。直到沒有進製,異或的結果就是最終的結果為止

如 101 + 011 -> 110 + 1010 -> 1100 + 0100 -> 1000 + 1000 -> 0 (異或出現了0,返回上一次異或的結果)

最終得到的是1000 也就是5+3=8

class solution while(num1!=0);

return temp;}};

求兩數之差;

根據c++上兩個互為相反數的int型資料的二進位制結構關係——整數的相反數等於該數按位取反再加1;

int oppositenumber(int n)

return add(~n, 1);

int subtract(int a, int b)

return add(a, oppositenumber(b));

思路二:

如果減數不為0,我們可以先把被減數和減數上同為1的位從兩個數上去除。至於如何分離出值同為1的位,則可以通過求位與操作來做到;

而把這些1分別中被減數和減數中去除,則可以通過按位異或來的操作來實現。

經步驟1處理後,被減數和減數在對應的位上,將或者通為0,或者分別為0和1,卻不會同為1。此時:

如果對應位被減數=0,而減數=1,則所得結果對應位還是1,但此時須向前一位借1;

== 即通過對減數左移一位得到需從臨時結果中減去的借數。==

於是,經過步驟2後,原來的減法變成了要求:臨時結果 - 借數

很明顯,只要以臨時結果為被減數,借數為減數,重複步驟1~3即可。

int subtract(int a,int b)

return a;

}加減乘除的實現————————————————

17 C 與 或 異或 取反等運算

位運算符號優先級別從高到低 其中 自由向左 0 0 0,0 1 0,1 0 0,1 1 1。即同為1才為1 c 輸出乙個數的二進位制 標頭檔案 include 如果a為int,其二進位制為 bitset 32 a 如果其為long long,bitset 64 a 0 0 0,0 1 1,1 0 1...

php位運算 與 或 異或 取反

php中有4個位運算,分別是 與 或 異或 取反 兩位全為1,結果為1 有一位為1,結果為1 乙個為0,乙個為1,結果為1 取反0 1,1 0 1.二進位制的最高位是符號位,0表示正數,1表示負數。2.正數的原碼,反碼,補碼都一樣。3.負數的反碼 它的原碼符號位不變,其它位取反 0 1,1 0 4....

php位運算 與 或 異或 取反

php中有4個位運算,分別是 與 或 異或 取反 兩位全為1,結果為1 有一位為1,結果為1 乙個為0,乙個為1,結果為1 取反0 1,1 0 1.二進位制的最高位是符號位,0表示正數,1表示負數。2.正數的原碼,反碼,補碼都一樣。3.負數的反碼 它的原碼符號位不變,其它位取反 0 1,1 0 4....