Подсчитайте количество цифр в шестнадцатеричном числе - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь подсчитать количество цифр в шестнадцатеричном формате.Например: 0x00000001 должен возвращать счет в виде 8.

Может ли кто-нибудь подсказать, какой самый эффективный способ сделать это?Я попытался преобразовать его в CString и получить длину, используя 'GetLength()', но, похоже, здесь это не работает.

Редактировать: Извините, если я забыл упомянутьМоя переменная, в которой хранится шестнадцатеричное число, является беззнаковым коротким.

Попробовал это:

unsigned short number;
CString HexValue;
HexValue.Format("%.8x",number);     // number = 0000000000000000, 16 0's
HexValue = "0x" + HexValue;
int length = HexValue.GetLength() - 2; // returns an 8 here

Ответы [ 4 ]

4 голосов
/ 20 октября 2011

Поскольку каждый байт содержит две шестнадцатеричные цифры, попробуйте переменную n целочисленного типа

sizeof(n)*CHAR_BIT/4
3 голосов
/ 20 октября 2011

Если 0x00000001 является строкой, то GetLength() - 2 должно дать 8. Если это значение хранится в другом типе (скажем, int), то просто запомните тот факт, что шестнадцатеричное кодирование требует 2 символана 8 бит для кодирования всего диапазона значений (sizeof(int) * 2)

1 голос
/ 20 октября 2011

Существует одна шестнадцатеричная цифра на 4 бита.

std::cout << sizeof(unsigned short) * CHAR_BIT / 4 << "\n";
std::cout << sizeof(unsigned short) * CHAR_BIS % 4 << " LEFTOVER PARTIAL DIGITS\n";
0 голосов
/ 20 октября 2011

Количество цифр в шестнадцатеричном числе n не более (1, ceil (log2 ( n ))). См. Wikipedia, двоичный логарифм для быстрого алгоритма вычисления log2.

Это не даст вам значение 8 для 0x00000001, так как на самом деле есть только одна цифра, необходимая для представления этого числа. Разница между 0x00000001 и 0x1 связана только с отображением.

...