我编写了一些代码,需要计算大小为10 ^ 19的数字中的设置位数。由于我使用的是c ++,我使用unsigned long long int来存储数字。我为它编写了两个版本,一个使用bitset,一个使用bitset。
unsigned long long int b;
cin>>b;
int cnt=0;
while(b){
if(b&1)cnt++;
b>>=1;
}
上面的代码给出了正确的结果。但是下面使用bitset的代码给出了不正确的结果。虽然看起来它应该以完全相同的方式工作。
unsigned long long int b;
cin>>b;
bitset<64>foo(b);
int cnt=foo.count();
请注意,unsigned long long int将适合64位,因为10 ^ 19 <2 ^ 64.一些额外的细节:因此问题文本不会变得难看,我将完整的代码添加为ideone链接,注意第51至57行http://ideone.com/4Yamhz
答案 0 :(得分:0)
根据http://www.cplusplus.com/reference/bitset/bitset/bitset/,
C ++ 98中bitset的构造函数允许unsigned long。相反,C ++ 11允许使用unsigned long long。可能截断?你没有提到你使用的编译器,所以你去...