Это ошибка boost :: dynamic_bitset? - PullRequest
2 голосов
/ 13 июня 2019

Я просматриваю реализацию boost для dynamic_bitset и обнаруживаю, что они просто сравнивают базовый тип целочисленного хранилища для улучшения производительности оператора <(), я проверяю правильность с помощью следующего кода и получаю противоречивый результат. Так это ошибка? </p>

std::vector<bool>       v1, v2;
v1.push_back(0); v1.push_back(1);
v2.push_back(1); v2.push_back(0);
std::cout << (v1 < v2) << '\n';

boost::dynamic_bitset<> b1, b2;
b1.push_back(0); b1.push_back(1);
b2.push_back(1); b2.push_back(0);
std::cout << (b1 < b2) << '\n';

Я ожидаю, что выход обоих будет равен 1, но второй вывод равен 0.

1 Ответ

2 голосов
/ 13 июня 2019

Посмотрите на набор битов от старших значащих битов до младших значащих битов

#include <iostream> 
#include <boost/dynamic_bitset.hpp> 
int main(int, char*[]) {
boost::dynamic_bitset<> x(5); // all 0's by default 
x[0] = 1; 
x[1] = 1; 
x[4] = 1;  
std::cout << x << "\n"; 
return EXIT_SUCCESS;
}

Выходные данные

10011

Оператор << для dynamic_bitset печатает набор битов изот наиболее значимого к наименее значимому, поскольку этот формат используется большинством людей для чтения.

И это то, что вы делаете

b1.push_back(0); b1.push_back(1);//b1 = 10    
b2.push_back(1); b2.push_back(0);//b2 = 01

Повышение корректно.Вы должны изменить порядок push_back s, чтобы получить то, что вы хотели. Повышение

...