下麵我們來討論按位異或操作的用途:
(1)使特定位的值取反
要使某個數的某幾位翻轉,就將與其進行“^”運算的操作數相應位置1即可(mask中特定位置1,其他位為0,s=s^mask)。
[例129]設有數100,其二進製為01100100,想使其低4位翻轉(即1變0,0變1),可以將其與00001111進行異或運算,運算結果的低4位正好是原數低4位的翻轉。
C語言源代碼:
#include
voidmain()
{
inta=100;
a=a^15;
printf("a=%d\n",a);
}
運行結果:
a=107(其二進製數為01101011)
(2)不引入第三個變量,交換兩個變量的值
[例1210]x=5,其二進製形式為00000101,y=7,其二進製形式為00000111。
想將x和y的值互換,可以用以下賦值語句實現:
x=x^y;|*x^y的結果,x已變成2*|
y=y^x;|*y^x的結果,y已變成5*|
x=x^y;|*x^y的結果,x已變成7*|
等效於以下兩步:
①執行前兩個賦值語句:x=x^y;和y=y^x;,相當於y=y^(x^y);。
②再執行第三個賦值語句:x=x^y;,由於x的值等於(x^y),y的值等於(y^x^y),相當於x=x^y^y^x^y;。
即x=x^x^y^y^y,等於y。
C語言源代碼:
#include
voidmain()
{
intx=5,y=7;
x=x^y;
y=y^x;
x=x^y;
printf("x=%dy=%d",x,y);
}
運行結果:
x=7y=5
(3)與0相異或,保留原值
由於原數中的1^0=1,0^0=0,故保留原數。
[例1211]120^0
#include"stdio.h"
voidmain()
{
inta=120,b=0;
a=a^b;
printf("a=%db=%d",a,b);
}
運行結果:
a=120b=0
4.取反運算符(~)
取反運算符“~”為單目運算符,用於求整數的二進製反碼,即分別將操作數的每個二進製位1置0,0置1,實現按位取反操作,該操作數具有右結合性。
例如:~10的運算為~(0000000000001010),結果為:1111111111110101。
[例1212]~66(8)。
#include