这个布尔运算是什么? `表达式 * 布尔值`
What is this boolean operation? `expression * boolean`
我看到一个问题,我们必须找到工资。如果工时少于 40 小时,我们支付正常工资($100/小时)如果有加班,我们支付原工资的 1.5 倍($150/小时)。
挑战是在没有 if-else/loops/or 三元运算的情况下解决它。
就这样解决了
int hours = /*some_number*/;
int wage = (100*hours) + (50*(hours-40))*(hours>40);
此代码有效。
(hours>40)
returns 1
如果小时数大于 40,returns 0
如果小时数小于 40。
我知道这是某种布尔运算,但它是如何工作的,它到底叫什么。
正确的做法是直截了当:
int hours = /*some_number*/;
int wage = 100*hours;
if (hours > 40) wage += 50 * (hours-40);
为了将其压缩为单个表达式,该示例利用了布尔值是 1 或 0 的事实。因此 x*some_bool
的计算结果为 x
或 0
。
在你的情况下,如果 (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 的唯一有效用途是在密码学或复杂性理论中使用的高级代数变换。
嗯,你基本上回答了你的问题。如果小时数大于 40,则 (hours > 40)
returns 1
否则 returns 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
}
我看到一个问题,我们必须找到工资。如果工时少于 40 小时,我们支付正常工资($100/小时)如果有加班,我们支付原工资的 1.5 倍($150/小时)。
挑战是在没有 if-else/loops/or 三元运算的情况下解决它。
就这样解决了
int hours = /*some_number*/;
int wage = (100*hours) + (50*(hours-40))*(hours>40);
此代码有效。
(hours>40)
returns 1
如果小时数大于 40,returns 0
如果小时数小于 40。
我知道这是某种布尔运算,但它是如何工作的,它到底叫什么。
正确的做法是直截了当:
int hours = /*some_number*/;
int wage = 100*hours;
if (hours > 40) wage += 50 * (hours-40);
为了将其压缩为单个表达式,该示例利用了布尔值是 1 或 0 的事实。因此 x*some_bool
的计算结果为 x
或 0
。
在你的情况下,如果 (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 的唯一有效用途是在密码学或复杂性理论中使用的高级代数变换。
嗯,你基本上回答了你的问题。如果小时数大于 40,则 (hours > 40)
returns 1
否则 returns 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
}