Почему бит std:: bitset в обратном порядке?

Почему биты хранят биты в обратном порядке? После многочасовой борьбы я, наконец, написал этот файл binary_to_dec. Могло ли это упростить?

int binary_to_dec(std::string bin)
{
    std::bitset<8> bit;

    int c = bin.size();

    for (size_t i = 0; i < bin.size(); i++,c--)
    {
        bit.set(c-1, (bin[i]-'0' ? true : false));
    }

    return bit.to_ulong();
}

Ответ 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();
}

Ответ 2

unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}

EDIT: форматирование и тип возвращаемого значения.