位操作運算符:參與運算的量,按二進制位進行運算。包括位與(&)、位 或(|)、位 非(~)、位異或(^)、左 移(<<)、右移(>>)六種。
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;">取火柴游戲的規則為:二人輪流從三堆火柴中取火柴(至少取1根,多取不限)。取到最后一根火柴的即為游戲勝方。
編程實現:給定三堆火柴的數目,程序判斷先手方能否獲勝。
輸入:12 56 33
輸出:先手可勝
輸入:12 45 33
輸出:后手可勝
【案例分析】
對于正整數x,y,z,有以下結論:
1、如果x^y^z>0,則:
(1)x,y,z三數中,至少有一個數不是0。
(2)一定可以將其中的一個數減少,使它們的異或為零。如:12,56,33。只需將56減少至45,則12,45,33的異或為零。
2、如果x^y^z=0,則無論改變哪一個數,其異或一定不是零。
因此,先手取勝的條件是:三堆火柴數目的異或非零。
取勝的策略是:減少某一堆火柴的數目,使剩下的三堆火柴數目的異或為零(結論1(2))。這樣一來,無論后手如何應對,輪到先手取火柴時,三堆火柴數目的異或必定非零(結論2)。只要先手遵循”取走火柴后確保三堆火柴數目的異或為零"這一原則,勝定。
【參考代碼】
main()
{unsigned int x,y,z;
scanf("%d%d%d",&x,&y,&z);
printf("%s",(x^y^z)>0?"先手可勝":"后手可勝");
}
【案例2描述】
利用加法運算和位運算實現二個正整數的乘法運算。
【案例分析】
以7*5為例,7*5=7*(1+4)=7+7*4=7+(7<<2)
得到m*n的算法如下:
(1)計算初值v=0
(2)如果n=0,計算結束,輸出v
(3)如果n&1,則v=v+m
(4)n>>=1,m<<=1。轉(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);
}