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....