【问题标题】:Set bits to one where bits of several values are all the same?将位设置为一个,其中几个值的位都相同?
【发布时间】:2014-02-27 01:29:32
【问题描述】:
为了检测x和y的位不同的地方,可以使用XOR:
z = ~(x^y)
将位设置为x 和y 的位相等的位。
我也想做同样的事情,但有两个以上的值:
template <typename T0, typename... TN>
constexpr T0 same(const T0 x0, const TN... xn)
{
// Something here
}
例如,对于 4 个值,same(x0, x1, x2, x3) 将返回一个掩码,其位设置为 1,其中 x0、x1、x2 和 x3 的位都相等。该怎么做?
【问题讨论】:
标签:
c++
optimization
bit-manipulation
bit
【解决方案1】:
可能是这样的:
template <typename T0, typename... TN>
T0 same(const T0 x0, const TN... xn)
{
const int size = sizeof...(xn);
int res[] = {xn...};
T0 a1 = x0, a2 = ~x0;
for (int i = 1; i < size; ++i){
a1 &= res[i];
a2 &= ~res[i];
}
return a1 | a2;
}
【解决方案2】:
same_bits = (x0 & x1 & ... & xn) | (~x1 & ~x2 & ... & ~xn))
【解决方案3】:
z = (x0&x1&x2&x3) | (~x0&~x1&~x2&~x3);
//In first bracket, get all bits that are 1, in second - all that are zero.
【解决方案4】:
and_all(x0, x1...) | ~or_all(x0, x1...)
【解决方案5】:
~ ((x0 ^ x1) | (x0 ^ x2) | (x0 ^ x3) ... )
XOR 为两个相对相等的位留下一个零;当所有面对的位都相等时,OR 会留下零; NOT 反转。
对于N变量,操作计数为
N-1 XOR、N-2 OR、1 NOT(总计 2N-2)。
将此与其他使用的解决方案进行对比
2N-2 与、1 或、N 非(总计 3N-1)或
N-1 AND,N OR,1 NOT(总计 2N)。