我想写一个简单的代码行,而不是求助于if语句,它会评估一个数字是否在某个范围内。我可以通过使用模数来评估0 - Max。
30 % 90 = 30 //great
但是,如果测试数大于最大值,那么使用模数只会在剩下的0处开始,如果它超过最大值,我希望将其限制为最大值
94 % 90 = 4 //i would like answer to be 90
无论如何,如果我引入范围的最小值,对我来说变得更加复杂。例如:
minimum = 10
maximum = 90
因此,我评估的任何数字都应在范围内,如果低于范围则为最小值,如果高于范围则为最大值
-76 should be 10
2 should be 10
30 should be 30
89 should be 89
98 should be 90
23553 should be 90
是否可以使用一行代码对此进行评估而不使用if语句?
答案 0 :(得分:3)
简单,但即使不使用if
仍然是分支:
r = ( x < minimum ) ? minimum : ( x > maximum ) ? maximum : x;
来自bit twiddling hacks,假设(2 <3)== 1:
r = y ^ ((x ^ y) & -(x < y)); // min(x, y)
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)
将它放在一起,假设min&lt;最大:
r = min^(((max^((x^max)&-(max<x)))^min)&-(x<min));
x<y
时的工作原理:
r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(1)); // x<y == 1
r = y ^ ((x ^ y) & ~0); // -1 == ~0
r = y ^ (x ^ y); // (x^y) & ~0 == (x^y)
r = y ^ x ^ y; // y^y == 0
r = x;
否则:
r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(0)); // x<y == 0
r = y ^ ((x ^ y) & 0); // -0 == 0
r = y; // (x^y) & 0 == 0
答案 1 :(得分:3)
可能最简单的方法是使用您的语言中提供的max
和min
这样的内容:
max(10, min(number, 90))
在某些语言中,例如Java,JavaScript和C#(可能还有其他)max
和min
是Math
类的静态方法。
我使用了clip
函数来简化它(这是在JavaScript中):
function clip(min, number, max) {
return Math.max(min, Math.min(number, max));
}
答案 2 :(得分:1)
使用C / C ++:
value = min*(number < min) +
max*(number > max) +
(number <= max && number >= min)*number%max;
以下是简要说明。请注意,代码依赖于两个重要问题才能正常工作。首先,在C / C ++中,布尔表达式可以转换为整数。其次,负数的提醒是它自己的数字。所以,它不是余数的数学定义。我不确定这是由C / C ++标准定义的还是留给实现的。基本上是:
if number < min then:
value = min*1 +
max*0 +
0*number%max;
else if number > max
value = min*0 +
max*1 +
0*number%max;
else
value = min*1 +
max*1 +
1*number%max;
答案 3 :(得分:1)
如果您使用的是具有三元运算符(如C或Java)的语言,则可以这样做:
t < lo ? lo : (t > hi ? hi : t)
其中t是测试变量,lo和hi是限制。这满足了你的约束,因为它不严格使用if语句,但是三元运算符实际上只是if语句的语法糖。
答案 4 :(得分:0)
我不知道你怎么可能......
(X / 10)&lt; 1? 10:(X / 90> 1→90:X)
数字除以10是否小于1?设为10 其他 如果数字除以90大于90,则设置为90 其他 设为X
请注意,它仍然是隐藏的ifs。 :(