位操作運(yùn)算符:參與運(yùn)算的量,按二進(jìn)制位進(jìn)行運(yùn)算。包括位與(&)、位 或(|)、位 非(~)、位異或(^)、左 移(<<)、右移(>>)六種。

word; clear: both; text-indent: 2em; color: rgb(24, 30, 51); font-family: PingFangSC, 微軟雅黑, 黑體, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255); line-height: 2;">【案例描述】
word; clear: both; text-indent: 2em; color: rgb(24, 30, 51); font-family: PingFangSC, 微軟雅黑, 黑體, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255); line-height: 2;">取火柴游戲的規(guī)則為:二人輪流從三堆火柴中取火柴(至少取1根,多取不限)。取到最后一根火柴的即為游戲勝方。
編程實現(xiàn):給定三堆火柴的數(shù)目,程序判斷先手方能否獲勝。
輸入:12 56 33
輸出:先手可勝
輸入:12 45 33
輸出:后手可勝
【案例分析】
對于正整數(shù)x,y,z,有以下結(jié)論:
1、如果x^y^z>0,則:
(1)x,y,z三數(shù)中,至少有一個數(shù)不是0。
(2)一定可以將其中的一個數(shù)減少,使它們的異或為零。如:12,56,33。只需將56減少至45,則12,45,33的異或為零。
2、如果x^y^z=0,則無論改變哪一個數(shù),其異或一定不是零。
因此,先手取勝的條件是:三堆火柴數(shù)目的異或非零。
取勝的策略是:減少某一堆火柴的數(shù)目,使剩下的三堆火柴數(shù)目的異或為零(結(jié)論1(2))。這樣一來,無論后手如何應(yīng)對,輪到先手取火柴時,三堆火柴數(shù)目的異或必定非零(結(jié)論2)。只要先手遵循”取走火柴后確保三堆火柴數(shù)目的異或為零"這一原則,勝定。
【參考代碼】
main()
{unsigned int x,y,z;
scanf("%d%d%d",&x,&y,&z);
printf("%s",(x^y^z)>0?"先手可勝":"后手可勝");
}
【案例2描述】
利用加法運(yùn)算和位運(yùn)算實現(xiàn)二個正整數(shù)的乘法運(yùn)算。
【案例分析】
以7*5為例,7*5=7*(1+4)=7+7*4=7+(7<<2)
得到m*n的算法如下:
(1)計算初值v=0
(2)如果n=0,計算結(jié)束,輸出v
(3)如果n&1,則v=v+m
(4)n>>=1,m<<=1。轉(zhuǎn)(2)
【參考代碼】
main()
{ int v=0,m,n;
scanf("%d%d",&m,&n);
while(n>0)
{ if(n&1)v+=m;
n>>=1;
m<<=1;
}
printf("%d",v);
}

