【问题标题】:c++ XOR between bitsets位集之间的c ++ XOR
【发布时间】:2017-07-06 12:22:13
【问题描述】:
std::bitset <1> a1;
std::bitset <1> a2;

a1 = std::bitset<1> (0);
a2 = std::bitset<1> (1);

std::bitset<1> b = (a1 ^= a2)

这会导致

b = 1

这很好,但也修改了a1,在异​​或运算后变为:

a1 = 1

为什么会这样? 在不创建 temp 变量的情况下如何避免这种情况?

【问题讨论】:

  • 嗯,它应该修改a1,因为你对a1 ^= a2所做的实际上等于a1 = a1 ^ a2
  • 使用^ 而不是^=
  • 你确定a2改变了吗?
  • 这不是问题,但代码确实有点旋转。无需创建您的 bitset 对象,然后从临时对象中分配给它们,只需使用适当的值初始化它们:std::bitset&lt;1&gt; a1(0); std::bitset&lt;1&gt; a2(1);

标签: c++ xor operation std-bitset


【解决方案1】:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
    std::bitset <1> a1;
    std::bitset <1> a2;

    a1 = std::bitset<1>(0);
    a2 = std::bitset<1>(1);

    std::bitset<1> b = (a1 ^ a2);
    std::cout << b << std::endl;
    std::cout << a1 << std::endl;
    std::cout << a2 << std::endl;
    return 0;

}

正确的输出: 1 0 1

#include <iostream>
#include <bitset>
using namespace std;
int main()
{
    std::bitset <1> a1;
    std::bitset <1> a2;

    a1 = std::bitset<1>(0);
    a2 = std::bitset<1>(1);

    std::bitset<1> b = (a1 ^= a2);
    std::cout << b << std::endl;
    std::cout << a1 << std::endl;
    std::cout << a2 << std::endl;
    return 0;

}

正确的输出: 1 1 1 因为^=,所以你改a1。

XOR 是运算符^

运算符^= 与赋值异或

【讨论】:

    【解决方案2】:
      std::bitset<1> b = (a1 ^= a2);
    

    您在此处将a1 修改为

    a1^=a2 等同于a1=a1^a2。而且它只会修改a1 而不会修改a2

    使用这个

      std::bitset<1> b = (a1 ^ a2); 
    

    【讨论】:

      【解决方案3】:

      in line : std::bitset b = (a1 ^= a2) ,您使用的是嵌套方程。

      如果你将简单化你将得到的 rhs -> a1 = a1^a2,那么你首先分配 a1 = 0 xor 1 即 1,然后你将 b 分配给 a1,这就是你得到 a1 = 1 的原因,和b一起。

      更多解释可以参考https://www.tutorialspoint.com/cplusplus/cpp_operators.htm(直接到赋值运算符部分)

      【讨论】:

        猜你喜欢
        • 2015-04-14
        • 2017-04-08
        • 2013-06-01
        • 2019-07-17
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        相关资源
        最近更新 更多