按位與運算子(&)
參加運算的兩個資料,按二進位制位進行「與」運算
運算規則:兩位同時為1結果才為
1,否則為
0.負數按補碼形式參加按位與運算
「與運算」的特殊用途:
(1)清零。如果想將乙個單元清零,即使其全部二進位制位為0,只要與乙個各位都為
0的數值相與,結果為
0.(2)取乙個數中指定位
方法:找乙個數,對應x要取的位,該數的對應位為
1,其餘位為
0,此數與
x進行「與運算」可以得到
x中的指定位。
按位或運算子(|)
特殊作用:
(1)常用來對乙個資料的某些位置1.
方法:找到乙個數,對應x要置
1的位,該數的對應位為
1,其餘位為
0,。此數與
x相或可使
x中的某些位置
1.例:將x=10100000的低4位置
1,用x|0000 1111=1010 1111
可得到。
異或運算子(^)
參加運算的兩個資料,按二進位制位進行「異或」運算
運算規則:參加運算的兩個物件,如果兩個相應位為「異」(值不同),則該位結果為1
,否則為0。
特殊作用:
(1)使特定位翻轉找乙個數,對應x要翻轉的各位,該數的對應位為
1,其餘位為
0,此數與
x對應位異或即可。
例:x=10101110,使x低
4位翻轉,用
x^0000 1111=1010 0001
即可得到。
(2)與0相異或,保留原值,
x^00000000=1010 1110
。按位異或其實就是不進製加法,如1+1=0,0+0,1+0=1.
異或的幾條性質:
1. 交換律
2. 結合律( a ^ b ) ^ c == a ^ ( b ^ c )
3. 對於任何數x,都有
x^x=0,x^0=x
4. 自反性:a ^ b ^ b = a ^ 0 = a;
異或運算最常見於多項式除法,不過它最重要的性質還是自反性:a xor b xor b = a,即對給定的數
a,用同樣的運算因子(
b)作兩次異或運算後仍得到
a本身。這是乙個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間: 設有
a,b兩個變數,儲存的值分別為a,
b,則以下三行表示式將互換他們的值 表示式 (值) :
a=a^b;
b=b^a;
a=a^b;
應用舉例:
1~1000放在
1001
個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?
解法一:把所有數加起來,減去1+2+……
+1000
的和。但問題是如果數列過大,則可能會導致溢位。
解法二:將所有數全部異或,得到的結果與1^2^3^…
^1000
的結果進行異或,得到的結果就是重複數。
左移運算子(
<<)
將乙個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。
例:a=a<<2將
a的二進位制位左移
2位,右補
0,左移1位後
a=a*2
;右移運算子(>>)
將乙個數的各二進位制全部右移若干位,正數左補0,負數左補
1,右邊丟棄。
運算元每右移一位,相當於該數除以2.
例如:a=a>>2將
a的二進位制位右移
2位,左補
0 or 補1
得看被移數是正還是負。
符合賦值運算子:
&= 例:
a &=b
相當於a=a& b
|= 例:
a |=b
相當於a=a |b
>>= 例:
a >>=b
相當於a=a>> b
<<= 例:
a<<=b
相當於a=a<< b
^= 例:
a ^= b
相當於a=a^ b
不同長度的資料進行位運算
如果兩個長度不同的資料進行位運算時,系統會將二者按右端對齊,然後進行位運算。
以「與」運算為例:
如果乙個long型別資料與乙個
int型別資料進行「與」運算,右端對齊後,左邊不足的位依下面三種情況補足,
(1)如果整型資料為正數,左邊補16個0。
(2)如果整型資料為負數,左邊補16個1。
(3)如果整型資料為無符號位,左邊也補16個0。
位運算:將乙個字元型二進位制數字轉換成10進製
int change(char *st)
int main()
位操作的運用
1. 奇偶性的判斷
對於二進位制表示來說,其最右位為1則該數為奇數,最右位為
0則該數為偶數。
int a;
cin>>a;
if( a & 1)
cout<<」奇數」<
2. 不借助變數交換兩個數
a=a^b;
b=a^b;
a=a^b;
3. 取相反數
將正數n變為
-n,將負數n變為
-n。將整數取反加1即可得到相反數:
常見等式:- n = ~ ( n - 1 ) = ~ n + 1
例子:求某整數的絕對值
int my_abs(int num)
return num;
}
4. 整數二進位制表示中最右邊的1
獲取整數二進位制表示中最右側的1:n & (-n)等價於
n & ~(n-1)
例如,n=1100,-n=0100,那麼
n & ( -n )=0100,
這樣就獲取到了二進位制表示中最右側的1。
去除整數二進位制表示中最右側的1:n & (n-1)
例如,n=1100,n-1=1011,那麼
n & (n-1)=1000,
這樣就去除了二進位制表示中最右側的1。
5.32位系統某數右移/左移
32位或更多位
在移位運算時,byte、
short
和char
型別移位後的結果會變成
int型別,對於
byte
、short
、char
和int
進行移位時,規定實際移動的次數和
32的餘數,也就是移位
33次和移位
1次得到的結果相同。
位運算相關題目
1、二進位制中
1的個數
用到了n & (n - 1)
(1)方法一:參考文章:整數的二進位制表示中
1的個數
方法二:二進位制位的翻轉和二進位制表示中1的個數
(2) 輸入兩個數a和
b,輸出將
a轉換為
b所需改變的二進位制的位數。
方法:首先,a異或
b得到的是a和
b中不相同位數組成的數,然後再求這個數二進位制表示中
1的個數,即為所求。
2、位操作的加減運算(用位操作實現加減)
加法和減法相似,因為根據異或的自反性,a+b也就相當於a+(-b); 相反數就是取反加一。
//1.加法操作
int binaryadd(int a, int b)
while (ca != 0);//迴圈直到某次運算沒有進製,運算結束
return add;
}
//2.減法操作
int binarysub(int a, int b)//減法操作就是加上乙個負數
3、求兩個數中較小的那個
y ^ ((x ^ y) & -(x < y))
分析:當x < y時,
-(x < y)為-1
,其補碼形式全為1,則
(x ^ y) & -(x < y) = x ^ y
,則上述表示式返回的是較小的數x;
當x >= y時,
-(x < y)為0
,補碼形式為全0,則
(x ^ y) & -(x < y) = 0
, 則表示式返回的是較小的數
y
位運算相關總結
計算機cpu中alu是由邏輯門構成的,非常善於位運算。因此,在程式中使用位運算,經常能夠加快程式執行。另外,掌握一些位運算的相關知識也能增加一些程式設計的樂趣。位運算經常使用到異或運算和與運算。異或運算符合交換律 結合律,它的特點是相同為0,不同為1。與運算是同為1則為1。詳細內容 1 兩個數比較大...
C語言 位運算相關總結
1.位運算符號 取反,不分正負數 標準規定在右邊補0 正數則左邊補0,負數標準沒有規定在左邊補充的數字,分為邏輯右移和算術右移,具體由編譯器決定,windows平台和gcc採取算術右移即負數補1 2.常見的二進位制位的變換操作 去掉最後一位 101101 10110 x 1 在最後加乙個0 1011...
位運算相關題目
面試中會遇到很多與位運算相關的題目,在這裡對位運算的相關知識點和遇到的一些題目總結一下。二進位制的5種位運算 與 或 異或 左移 m 右移 m n表示 把m右移n位 最右邊的n為會被丟棄,如果數值原來是個正數,用0補上最左邊的n位,如果是乙個負數,則最左邊補上n個1 題型一 進製轉換 微軟產品exc...