'if((mask | u)== u)'是什么意思?

时间:2020-07-17 07:40:46

标签: c++ if-statement bitwise-operators

这是maximum sum子集问题的递归关系。

完整的代码是:

if ((mask | u) == u)
    dp[u] = max(max(0, dp[u ^ mask] + array[I], dp[u]);

以下if语句到底是什么意思?

if((mask | u) == u)

提前谢谢!

2 个答案:

答案 0 :(得分:6)

这表示:“ masku的所有位都是”。 因此,如果mask中没有u中的某个位,则此测试返回false。

例如,对于mask=0b001u=0b011,它返回true。但是使用mask=0b101u=0b011会返回false,因为mask的第三位未在u中设置。

答案 1 :(得分:2)

对于二进制OR

二进制A,如果 {{1} } B。这些按位运算扩展到二进制数字的 strings 。在(1)中,最常表示为A = 1

B = 1

(原谅ASCII艺术-更加简洁的插图和链接为here


C/C++integral types个二进制数字(位)OR | A = 0 | A = 1 | ----------------------- B = 0 | (0) | (1) | ----------------------- B = 1 | (1) | (1) | -----------------------

mask = {m(n - 1), m(n - 2), .., m(1), m(0)}(n)个二进制数字(位)m(i)


让我们考虑 u = {u(n - 1), u(n - 2), .., u(1), u(0)} (n) ;如果这些按位比较中的任何 false ,则表达式 u(i) 的值为 false

(m(i) | u(i)) == u(i)表中,我们可以得出结论,当且仅当 i = {0, .., n - 1}((mask | u) == u)时,表达式为假。即: OR ,它不等于等于 m(i) = 1


表达问题的一种更简洁的方法是,如果u(i) = 0在位置m(i) | u(i) == (1) OR (0) == (1)上有点{strong>设置为u(i) == 0,并且{{1} }在相同位置上有点{strong>已清除,mask,然后(i) 不能等于(1)

相关问题