有没有办法使用位运算符而不是多个三元运算符?
Is there a way to use Bitwise Operators instead of multiple Ternary Operators?
有没有一种方法可以获得将三元 ?:
运算符应用于各个位的结果,而无需一次实际计算一位,即使用 和 [=41 的某种组合=]-s, or-s, xor-s, not-s?
换句话说,假设我们有 3 int
s(不考虑位长):a
、b
和掩码 m
,结果 r
基本上应该是:r = m ? a : b
,除了按位计算。
假设a = 0b0101; b = 0b1110;
和m = 0b0110
,结果r
应该是0b1100
。因此,如果掩码 m
中的位 n 为 1
(真),则使用 n 位 a
;否则(如果掩码 m
中的位 n 为 0
(假))则使用来自 n 的位b
.
如果m
、a
和b
都保证为0或1,则m ? a : b
等价于(m && a) || (!m && b)
。您可以通过在公式中注入 m=0
或 m=1
并简化它来看到这一点。
这也适用于位; bitwise not通常记为~
;所以你要找的“按位三元运算符”可以表示为:
(m&a)|((~m)&b)
出于解释的目的,我很快意识到问题可以被认为是通过使用掩码 m
从 a
和 b
中获取所有有效的 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
有没有一种方法可以获得将三元 ?:
运算符应用于各个位的结果,而无需一次实际计算一位,即使用 和 [=41 的某种组合=]-s, or-s, xor-s, not-s?
换句话说,假设我们有 3 int
s(不考虑位长):a
、b
和掩码 m
,结果 r
基本上应该是:r = m ? a : b
,除了按位计算。
假设a = 0b0101; b = 0b1110;
和m = 0b0110
,结果r
应该是0b1100
。因此,如果掩码 m
中的位 n 为 1
(真),则使用 n 位 a
;否则(如果掩码 m
中的位 n 为 0
(假))则使用来自 n 的位b
.
如果m
、a
和b
都保证为0或1,则m ? a : b
等价于(m && a) || (!m && b)
。您可以通过在公式中注入 m=0
或 m=1
并简化它来看到这一点。
这也适用于位; bitwise not通常记为~
;所以你要找的“按位三元运算符”可以表示为:
(m&a)|((~m)&b)
出于解释的目的,我很快意识到问题可以被认为是通过使用掩码 m
从 a
和 b
中获取所有有效的 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