c++ - 这是 std::bitset::operator^= 和 std::bitset::count 的正常行为吗?如果是这样,为什么?

标签 c++ c++11 stl bitset

<分区>

记录在案here , std::bitset::operator^= 返回 *this。从这一点以及对诸如 +=, |=, *= 等运算符的“通常”解释,我们可以合理地假设给定的 std::bitset 实例(相同size) ab,表达式 (a^=b).count() 将存储按位 XOR 的结果a 中的 操作,count() 将返回 a 中设置为 true 的位数。但是,正如以下最小示例所示,发生了意想不到的事情:

#include <iostream>
#include <bitset>

int main()
{
    constexpr unsigned int N=6; 
    std::bitset<N> a; 
    std::bitset<N> b; 

    a.flip();//111111
    b[0]=1;
    b[4]=1;//b is now 010001 (assuming least significan bit on the right end of the string)

    std::cout<<"a=="<<a.to_string()<<std::endl;
    std::cout<<"b=="<<b.to_string()<<std::endl;
    std::cout<<"(a xor b) to string=="<<(a^=b).to_string()<<std::endl;

    //Here is the unexpected part!
    std::cout<<"(a xor b) count=="<<(a^=b).count()<<std::endl;
    //Note that the following lines would produce the correct result
    //a^=b;
    //std::cout<<a.count()<<std::endl;


    return 0;
}

输出是

a==111111
b==010001
(a xor b) to string==101110       
(a xor b) count==6                //this is wrong!!!!! It should be 4...

快速查看 std::bitset 的实现(参见 here )似乎表明返回的引用确实是对 lhs 对象的引用(a 在我的例子中)。那么……为什么会这样?

最佳答案

这与bitset无关。考虑这段代码:

int a = 2;
int b = 3;
std::cout << std::to_string(a *= b) << std::endl; // Prints 6.
std::cout << std::to_string(a *= b) << std::endl; // Prints 18.

您正在使用赋值运算符,因此您的变量/位集每次 都会更改。在您的情况下,第二次评估产生 ((a ^ b) ^ b),这当然是原始的 a(确实设置了 6 位)。

关于c++ - 这是 std::bitset::operator^= 和 std::bitset::count 的正常行为吗?如果是这样,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762080/

相关文章:

c++ - 这个函数如何将文本读入结构?

c++ - 编译时大小未知的位集

c++ - 为什么move构造函数不通过using声明继承

c++ - 使用 lambda 的可变参数模板 : error with g++ but running with clang++

c++ - 如何比较C++ slice_array?为什么它不能与 valarray 进行比较?

c++ - strstr return 如何不是一个常数

c++ - 在新的 Qt SDK 中,我得到 <QtInstallationDir>\QtSDK\QtCreator\lib\qtcreatorcdbext32\qtcreatorcdbext.dll 找不到错误

c++ - 为什么 is_copy_constructible 在 MSVC12 中为 unique_ptr 返回 true

c++ - 修剪 std::string 中的内部空格

c++ - 如果 vector 有足够的空间(通过保留创建),std::vector::insert() 是否会使迭代器无效?