C++ 这是std::bitset::operator^=和std::bitset::count的正常行为吗?若然,原因为何?
如文件所述,C++ 这是std::bitset::operator^=和std::bitset::count的正常行为吗?若然,原因为何?,c++,c++11,stl,bitset,C++,C++11,Stl,Bitset,如文件所述,std::bitset::operator^=返回*此。根据这一点以及诸如+=,|=,*=等运算符的“通常”解释,可以合理地假设给定std::bitset实例(大小相同)a和b,表达式(a^=b).count()将按位XOR操作的结果存储在a中,而count()将返回a中设置为true的位数。但是,正如下面的示例所示,发生了一些意想不到的事情: #include <iostream> #include <bitset> int main() { co
std::bitset::operator^=
返回*此
。根据这一点以及诸如+=,|=,*=
等运算符的“通常”解释,可以合理地假设给定std::bitset
实例(大小相同)a
和b
,表达式(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;
}
快速查看一下std::bitset(请参阅)的实现,似乎表明返回的引用确实是对lhs对象的引用(在我的示例中为
A
)。所以为什么会发生这种情况?这与位集无关。考虑这个代码:
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.
inta=2;
int b=3;
std::不能使用(a^b).count()
,而不能使用(a^=b).count()
。您正在分配a
,并来回切换位状态。(a^=b)
将被计算两次。问题是您的注释是错误的。用替代品替换“断开”行会产生相同的输出。除非你想保持“坏”的线和交替的。在C++中,作为一个经验法则,如果你使用字符<代码>=<代码>,那么你所做的描述将涉及“相等”一词。在a^=b
的情况下,它是“a等于a^b”,在a==b
的情况下,它是“a等于b”等等,有许多运算符具有a=^
isxor
,^=/code>isxor
赋值。您不想修改a
,只想得到a或b的结果。
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.