Является ли std :: bitset bit-order переносимым? - PullRequest
8 голосов
/ 25 октября 2011

Говорит ли C ++ о порядке следования битов?Я особенно работаю над макетами пакетов протоколов, и я сомневаюсь, что существует переносимый способ указать, что определенное число записывается в биты 5,6,7, где бит 5 является «наиболее значимым».

Мои вопросы:

  • - это 0x01, всегда представленный в виде байта с установленным битом 7?
  • - это bitset<8>().set(7).to_ulong(), всегда равное 1?

Ответы [ 3 ]

11 голосов
/ 25 октября 2011

От 20,5 / 3 (ИСО / МЭК 14882: 2011)

При преобразовании между объектом класса bitset и значением некоторого целочисленного типа позиция бита pos соответствует значению бита 1 <<pos. </p>

То есть bitset<8>().set(7).to_ulong() гарантированно будет (1 << 7) == 128.

2 голосов
/ 25 октября 2011

Если вопрос заключается в том, можете ли вы с радостью игнорировать порядковый номер платформы при отправке двоичных объектов по сети, ответ - нет. Если вопрос в том, даст ли один и тот же код, скомпилированный на двух разных платформах, одинаковые результаты, тогда ответ - да.

2 голосов
/ 25 октября 2011

bitset не выполняет сериализацию, поэтому вы не должны (должны знать). Использовать сериализацию / десериализацию.

- это набор битов <8> (). Set (7) .to_ulong () всегда равен 1

Нет, не на моей машине (см. Ниже).

Однако я бы, конечно, ожидал, что операторы iostream будут вести себя переносимо:

#include <bitset>
#include <sstream>
#include <iostream>

int main()
{
    std::bitset<8> bits;
    std::cout << bits.set(7).to_ulong() << std::endl;

    std::stringstream ss;
    ss << bits;

    std::cout << ss.rdbuf() << std::endl;

    std::bitset<8> cloned;
    ss >> cloned;
    std::cout << cloned.set(7).to_ulong() << std::endl;
    std::cout << cloned << std::endl;
}

Печать

128
10000000
128
10000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...