Ответ 1
Bitset сохраняет свои номера в том, что вы считаете "обратным", потому что мы записываем цифры числа в порядке убывания значимости, даже если символы строки упорядочены в возрастающем порядке индекса.
Если бы мы написали наши числа в порядке малых порядков, то у вас не было бы этой путаницы, потому что символ в индексе 0 вашей строки представлял бы бит 0 битового набора. Но мы пишем наши числа в большом порядке. Боюсь, я не знаю подробностей истории человечества, которые привели к этой конвенции. (И обратите внимание, что конечность, которую использует какой-либо конкретный процессор для хранения многобайтовых чисел, не имеет значения. Я говорю об утверждении, которое мы используем при отображении чисел для чтения людьми.)
Например, если мы пишем десятичное число 12 в двоичном формате, получаем 1100. Наименее значимый бит находится справа. Мы называем это "бит 0." Но если мы поместим это в строку, "1100"
, символ в индексе 0 этой строки представляет бит 3, а не бит 0. Если мы создали битовый набор с битами в том же порядке, что и символы, to_ulong
вернется 3 вместо 12.
Класс биттетов имеет конструктор, который принимает std::string
, но ожидает, что индекс символа будет соответствовать индексу бита, поэтому вам нужно отменить строку. Попробуйте следующее:
int binary_to_dec(std::string const& bin)
{
std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
return bit.to_ulong();
}