【问题标题】:Special masking operation in c++c++中的特殊屏蔽操作
【发布时间】:2016-03-28 19:03:47
【问题描述】:

我需要使用 c++ 对变量中的每个位进行异或 让我们考虑 4 位值 a 和 x,其中它们的位表示是 a = a3a2a1a0x = x3x2x1x0。 我们定义掩蔽操作“。”作为a.x = a3x3(xor)a2x2(xor)a1x1(xor)a0x0

我做了 a&x 并找到 a3x3 a2x2 a1x1 a0x0 现在我需要对它们进行异或,但如何?有什么特别的方法可以做到这一点吗?像'&'操作?我搜索但没有找到任何东西..任何帮助将不胜感激!

【问题讨论】:

  • x3x2x1x0 是什么意思? 我假设a3a2a1a00xA3A2A1A0编辑:知道了。
  • 异或的操作符是^
  • If you'd searched for C++ operators 你会很快找到 xor 运算符...
  • @Jarod42 *operator ;)
  • 1)x3 第四位 x2 第三位等等.. 2) 这个 '^' 用于 2 个变量我想在 1 个变量中对每个位进行异或 @Borgleader 我看到了页面但只有 2 个变量的异或运算

标签: c++ bit masking


【解决方案1】:

根据您的描述,您将得到的最终结果是 0 或 1,因为您完成了与运算,您需要计算与运算结果的二进制表示中有多少个 1:a&x。

你需要做的就是一个一个地移位并计算1,如果最终结果为奇数则最终结果为1,如果偶数则最终结果为0。

【讨论】:

    【解决方案2】:

    您需要移动“a 和 x”来执行所有位的异或。

    类似:

    uint32_t a = 0xa;
    uint32_t x = 0xb;
    
    uint32_t tmp = a & x;         // Bitwise AND of a and x
    uint32_t res = 0;
    for (int i = 0; i < 32; ++i)
    {
        res = res ^ (0x1 & tmp);  // Only include LSB of tmp in the XOR
        tmp = tmp >> 1;           // Shift tmp to get a new LSB
    }
    cout << "Result: " << res << endl;
    

    另一种解决方案可能是:

    uint32_t a = 0xa;
    uint32_t x = 0xb;
    
    uint32_t tmp = a & x;         // Bitwise AND of a and x
    uint32_t res = 0;
    while (tmp > 0)
    {
        if ((tmp % 2) == 1) res = (res + 1) & 0x1;  // XOR operation
        tmp = tmp/2;                                // Shift operation
    }
    cout << "Result: " << res << endl;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多