有没有办法使用位运算符而不是多个三元运算符?

Is there a way to use Bitwise Operators instead of multiple Ternary Operators?

有没有一种方法可以获得将三元 ?: 运算符应用于各个位的结果,而无需一次实际计算一位,即使用 和 [=41 的某种组合=]-s, or-s, xor-s, not-s?

换句话说,假设我们有 3 ints(不考虑位长):ab 和掩码 m,结果 r 基本上应该是:r = m ? a : b,除了按位计算。

假设a = 0b0101; b = 0b1110;m = 0b0110,结果r应该是0b1100。因此,如果掩码 m 中的位 n1(真),则使用 na;否则(如果掩码 m 中的位 n0 (假))则使用来自 n 的位b.

如果mab都保证为0或1,则m ? a : b等价于(m && a) || (!m && b)。您可以通过在公式中注入 m=0m=1 并简化它来看到这一点。

这也适用于位; bitwise not通常记为~;所以你要找的“按位三元运算符”可以表示为:

(m&a)|((~m)&b)

出于解释的目的,我很快意识到问题可以被认为是通过使用掩码 mab 中获取所有有效的 1并结合结果。那么问题就变得微不足道了,如实说明table:

-------------------------------------------
         a:   0   0   0   0   1   1   1   1
         b:   1   1   0   0   1   1   0   0
         m:   1   0   1   0   1   0   1   0   // 1 = the positions from a; 0 = positions from b

        ~m:   0   1   0   1   0   1   0   1
 
 x = m & a:   0   0   0   0   1   0   1   0   // take all valid 1s from a
y = ~m & b:   0   1   0   0   0   1   0   0   // take all valid 1s from b

 r = x | y:   0   1   0   0   1   1   1   0   // combine: r = (m & a) | (~m & b)
-------------------------------------------
  EXPECTED:   0   1   0   0   1   1   1   0

使用 xor-s 的替代实现:r = b ^ (m & (a ^ b))

-------------------------------------------
         a:   0   0   0   0   1   1   1   1
         b:   1   1   0   0   1   1   0   0
         m:   1   0   1   0   1   0   1   0   // 1 = the positions from a; 0 = positions from b

 u = a ^ b:   1   1   0   0   0   0   1   1
 v = m & u:   1   0   0   0   0   0   1   0

 r = b ^ v:   0   1   0   0   1   1   1   0
-------------------------------------------
  EXPECTED:   0   1   0   0   1   1   1   0