В настоящее время я работаю над проектом, который требует от меня сохранить 32-битный шаблон и проанализировать его. Мне нужен способ сохранить шаблон, такой как «1001 1001 1100 1000», в переменной, где он не будет интерпретироваться, например, как символ.
В C ++ 03 я бы использовал unsigned int
или же unsigned long
но ни один не указан точно 32-битным. unsigned long
указано, чтобы иметь возможность держать по крайней мере значения [0, 232-1], поэтому теоретически он может быть больше 32 бит. В C ++ 11 я бы использовал uint32_t
;
например 0000 0000 0000 0000 1001 1001 1100 1000
является 0x99c8
, где 0x
это шестнадцатеричный префикс.
uint32_t bitpattern = 0x998c
Если переменная bitpattern
содержит желаемый битовый шаблон, и вы хотели бы передать его на консоль в виде шестнадцатеричного числа, вы бы использовали это:
std::cout << std::hex << bitpattern;
Если вы хотите преобразовать 32-битные шаблоны в int, вы также можете использовать контейнер STL <bitset>
сделать работу:
std::bitset<32> bit(std::string("0001100111001000"));
long unsigned bit_number = bit.to_ulong();
std::string bit_string = bit.to_string();
Вы понимаете, что шаблон не 32-битный, верно?
Так как это не так, что-то вроде
unsigned long pattern = 0x99c8;
должно быть очень безопасно, вам будет трудно найти платформу, где unsigned long
меньше 16 бит. Lke Армен сказал, если у вас есть uint32_t
, используй это.
Помимо попыток использовать интегральный тип и битовую маску для создания собственной системы, вы также можете рассмотреть возможность использования редко используемой встроенной функции, а именно: битовые поля. Определение такого типа очень похоже на структуру, однако тип данных для каждого элемента является анонимным, а размер определяется числом битов. Есть некоторые накладные расходы, но не намного больше, чем вы пытались бы реализовать самостоятельно; фактически вы позволяете компилятору выполнять работу.
Если вам нужно преобразовать структуру туда и обратно между целочисленным типом (например, long), вы можете просто (ab) использовать reinterpret_cast:
struct bitSet {
bitSet(long in1) { //ctor, eg bitSet tmpBit(input);
*this = reinterpret_cast<bitSet>(in1);
}
long toLong() { //eg output=tmpBit.toLong;
return reinterpret_cast<long>(*this);
}
unsigned U0 : 4;
unsigned U1 : 4;
unsigned U2 : 4;
unsigned U3 : 4;
unsigned U4 : 4;
unsigned U5 : 4;
unsigned U6 : 4;
unsigned U7 : 4;
};
Преимущество этого состоит в том, что, хотя вы не можете гарантировать длину целочисленного типа, такого длинного, это гарантирует, что каждый элемент имеет длину всего 4 бита.