将位设置为一个值,其中几个值的位都是相同的

Set bits to one where bits of several values are all the same?

本文关键字:几个 设置 一个      更新时间:2023-10-16

为了检测x和y的位不同,可以使用 XOR

z = ~(x^y)

将将位设置为一个位置,其中xy的位相等。

我想做同样的事情,但有两个以上的值:

template <typename T0, typename... TN>
constexpr T0 same(const T0 x0, const TN... xn)
{
    // Something here
}

例如,对于4个值, same(x0, x1, x2, x3)将返回一个掩码,其中一个位设置为一个位置,其中 x0x1x2x3的位均相等。如何做?

也许是这样的东西:

   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;
    }
same_bits = (x0 & x1 & ... & xn) | (~x1 & ~x2 & ... & ~xn))
z = (x0&x1&x2&x3) | (~x0&~x1&~x2&~x3); 
//In first bracket, get all bits that are 1, in second - all that are zero.
~ ((x0 ^ x1) | (x0 ^ x2) | (x0 ^ x3) ... )

Xors留下一个零面向两个相等的位;当所有脸部相等时,OR离开零;不弯曲。

对于N变量,操作计数为

N-1 XORS,N-2 ORS,1不(总2N-2)。

与其他使用的解决方案进行对比

2N-2 ands, 1或, N nots(总3N-1)或

N-1 ands, N ors, 1不(总计 2N)。

and_all(x0, x1...) | ~or_all(x0, x1...)