【问题标题】: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)

将位设置为xy 的位相等的位。

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

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

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

【问题讨论】:

    标签: 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)。

            【讨论】:

              猜你喜欢
              • 2012-04-06
              • 1970-01-01
              • 1970-01-01
              • 2019-05-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多