将位设置为1,其中几个值的位都相同?

时间:2014-02-03 14:06:58

标签: c++ optimization bit-manipulation bit

为了检测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)将返回一个掩码,其位设置为1,其中x0x1x2和{{1}的位都是平等的。怎么做?

5 个答案:

答案 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)。