目录
1.灵感来源
玩过硬件的对“位运算”都不陌生,但很多人初学的C语言的时候肯定不会重视位运算(晦涩难懂),因此我们学什么都是按部就班老师教什么学什么。
那是什么让我想出的这个写法呢?
事情是这样的:今天在玩arduino遥感模块的时候,涉及x,y,z方向上的取值或取值范围来判断方位,原型是不是有点像三个数比较大小?按照惯性思维肯定就是三个数和某个数比较大小来判断,if else嵌套,但是觉得好麻烦,于是乎,想着能不能用switch来实现。
2.算法实现及原理分析
下面是主要的实现代码,先贴代码再分析,不给点赞不愿意!
switch ((a >= b) << 2 | (b >= c) << 1 | (a >= c))
{
case 0:max = c; mid = b; min = a; break;
case 2:max = b; mid = c; min = a; break;
case 3:max = b; mid = a; min = c; break;
case 4:max = c; mid = a; min = b; break;
case 5:max = a; mid = c; min = b; break;
case 7:max = a; mid = b; min = c; break;
}
数数,是不是9行!
原理分析:乍一看,大喊卧槽,定睛一看,原来是这样。
首先看(a >= b) << 2,我们知道比较运算符结果为True or False,也就是对应二进制1和0,那么这个问题就简单了:假设成立,那么a>=b其实值为1,左移两位也就是0001<<2=0100,就是你们理解的乘以4;后面两个条件同理,通过位或(|)运算这样我们就能知道哪些条件是成立的哪些是不成立的。
这样从0000-0111之间就会产生8个值,现在我们再看一个简单的排列组合问题,三个数比较大小,会有几种情况:
无非就是三个坑,把三个数分别填进去,就是 3 x 2 x 1 = 6种,也就是说这8个值有两个是不可能成立的条件;
分析到这里相信大家都懂了,还不懂?没关系,带你分析一个case,
比如说case 0;也就是(a >= b) << 2 | (b >= c) << 1 | (a >= c)这个值为0,也就是说三个条件都不成立,那就好分析了:a>=b不成立,说明a
3.完整代码及验证
#include
#include
void main()
{
int a , b , c ;
int max,mid,min;
printf("请依次输入a,b,c,中间用空格隔开:");
scanf("%d %d %d", &a, &b, &c);
switch ((a >= b) << 2 | (b >= c) << 1 | (a >= c))
{
case 0:max = c; mid = b; min = a; break;
case 2:max = b; mid = c; min = a; break;
case 3:max = b; mid = a; min = c; break;
case 4:max = c; mid = a; min = b; break;
case 5:max = a; mid = c; min = b; break;
case 7:max = a; mid = b; min = c; break;
}
printf("最大数为=%d 中间数为=%d 最小数为=%d\n", max, mid, min);
system("pause");
}
为了方便验证,加了个死循环:
是不是感觉有、意思了。欢迎关注【菜小涛】,一个成长中的小白。
标签:case,min,max,......,mid,C语言,break,switch
来源: https://blog.csdn.net/weixin_43894786/article/details/105686413