У меня есть строка, состоящая из 8 символов.
std::string input = { 'A', 'B', 'C', 'D', 'E', 'F', 'A', 'F' };
У меня есть 64-разрядное целое число, которое будет содержать шестнадцатеричное соответствие этой строки. И четыре 16-битных целых числа, в которые будет разбираться число.
uint64_t number = 0;
uint16_t part0;
uint16_t part1;
uint16_t part2;
uint16_t part3;
Я преобразую строку в число, используя stringstream (никогда ранее не использовался)
std::stringstream ss;
ss << std::hex << input;
ss >> number;
I тогда И число с 0x000000FF и смещением вправо 16 бит.
part0 = number & 0x000000FF; //output: AF
number >>= 16;
part1 = number & 0x000000FF; //output: CD
number >>= 16;
part2 = number & 0x000000FF; //output: 0
number >>= 16;
part3 = number & 0x000000FF; //output: 0
Однако, хотя строка состоит из 8 символов, число составляет 64 бита, а части - 16 бит, это не работает при сдвиге 16 биты. Результаты, как я отметил, в качестве комментариев. Очевидно, что он сдвигается вдвое больше, чем должен, поэтому я попытался сдвинуть 8 бит, и это работает так, как должно. Я совершенно сбит с толку, может кто-нибудь объяснить, почему?
edit:
Как указано в комментариях john , одно шестнадцатеричное число di git равно 4 битам, не 8, как я думал. Это была проблема.