Разбор 64-битного числа в 16-битные части не работает интуитивно [решено] - PullRequest
1 голос
/ 03 мая 2020

У меня есть строка, состоящая из 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, как я думал. Это была проблема.

...