为了检测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
和{{1}的位都是平等的。怎么做?
答案 0 :(得分:3)
也许是这样的:
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;
}
答案 1 :(得分:2)
same_bits = (x0 & x1 & ... & xn) | (~x1 & ~x2 & ... & ~xn))
答案 2 :(得分:1)
z = (x0&x1&x2&x3) | (~x0&~x1&~x2&~x3);
//In first bracket, get all bits that are 1, in second - all that are zero.
答案 3 :(得分:0)
and_all(x0, x1...) | ~or_all(x0, x1...)
答案 4 :(得分:0)
~ ((x0 ^ x1) | (x0 ^ x2) | (x0 ^ x3) ... )
对于两个面向相等的位,XOR为零;当所有相对的位相等时,OR保持为零; NOT反转。
对于N
变量,操作计数为
N-1
XOR,N-2
或,1
NOT(总2N-2
)。
将此与使用
的其他解决方案进行对比 2N-2
AND,1
或,N
NOTs(总3N-1
)或
N-1
AND,N
或,1
NOT(总2N
)。