位運算符號優先級別從高到低:~ & ^ |;
其中~自由向左0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同為1才為1;
c++輸出乙個數的二進位制; 標頭檔案#include;0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1如果a為int,其二進位制為:(bitset<32>(a))
如果其為long long,(bitset<64>(a))
即有乙個為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;
哪些為0的位,結果是1,而哪些為1的位,結果是0。例如, ~7的結果為0xfff8。int a;
a=a^b;
b=b^a;
//b=b^a^b;
a=a^b;
//a=a^b^a^b^b;
移動n位,則相當於原數* 2^n;
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
依照這個思路,我們來看兩個數(我們假設是ab)出現一次的陣列。我們首先還是先異或,剩下的數字肯定是a、b異或的結果,這個結果的二進位制中的1,表現的是a和b的不同的位。我們就取第乙個1所在的位數,假設是第3位,接著把原陣列分成兩組,分組標準是第3位是否為1。如此,相同的數肯定在乙個組,因為相同數字所有位都相同,而不同的數,肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,剩餘的兩個結果就是這兩個只出現一次的數字。
思路:class
solution
*num1=r1;
*num2=r2;}}
;
& 按位與運算:相同位的兩個數字都為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
根據c++上兩個互為相反數的int型資料的二進位制結構關係——整數的相反數等於該數按位取反再加1;class
solution
while
(num1!=0)
;return temp;}}
;
int
oppositenumber
(int n)
return
add(
~n,1);
intsubtract
(int a,
int b)
return
add(a,
oppositenumber
(b))
;}
加減乘除的實現int
subtract
(int a,
int b)
return a;
}
C 與 或 異或 取反等運算
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,...
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....