这个布尔运算是什么? `expression * boolean`

时间:2017-11-18 17:20:23

标签: c++ boolean-operations

我看到了一个问题,我们必须找到工资。如果小时数小于40,我们支付正常工资(100美元/小时),如果有加班费,我们给予原始工资的1.5倍(150美元/小时)。

挑战是在没有if-else / loops /或三元操作的情况下解决它。

它像这样解决了

buffer

此代码有效。 如果小时数大于40,则int hours = /*some_number*/; int wage = (100*hours) + (50*(hours-40))*(hours>40); 会返回(hours>40),如果小时数则会返回1。 我知道它是某种布尔运算,但它是如何工作的,这究竟是什么。

2 个答案:

答案 0 :(得分:1)

正确的做法是直截了当的:

int hours = /*some_number*/;
int wage = 100*hours;
if (hours > 40) wage += 50 * (hours-40);

要将其压缩为单个表达式,该示例利用布尔值为1或0的事实。因此x*some_bool计算为x0

在您的情况下,如果(hours > 40)

(50*(hours-40))*(hours>40) == (50*(hours-40)) * 1 == 50*(hours-40)

否则为0

(50*(hours-40))*(hours>40) == (50*(hours-40)) * 0 == 0

通常,以这种方式编写代码的可读性较差。 IMO唯一有效的用途是用于密码学或复杂性理论中的高级代数变换。

答案 1 :(得分:0)

嗯,你基本上回答了你的问题。如果小时数大于40,则(hours > 40)会返回1,否则会返回0

可能更棘手的部分是这个布尔结果在被加班费乘以之前转换为int implicitly的事实,但这超出了问题的范围。

所以整个代码确实可以用这种方式扩展

int hours = /* something */
int wage = 0;
int overtime = hours - 40;
if (hours > 40) {
  wage = 100*hours + 50*overtime;
}
else {
  wage = 100*hours
}