计算机位运算符与表达示的应用案例

zhushican 2年前 (2022-06-09) 六六互联 330 0

位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位 或(|)、位 非(~)、位异或(^)、左 移(<<)、右移(>>)六种。 

计算机位运算符与表达示的应用案例

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);

}