#c #binary #hex #bit-shift #bitmask
#c #двоичный #шестнадцатеричный #битовый сдвиг #битовая маска
Вопрос:
Я пытаюсь преобразовать строковое представление 32-разрядного двоичного числа в строку, представляющую шестнадцатеричное значение этого числа в вызываемой функции hexConversion()
. Для этого мне требуется использовать только базовое программирование на C (для циклов, базовых массивов) и битовый сдвиг / маскирование. В этом назначении используется двоичное представление, которое возвращается в виде массива из другой функции binaryConversion()
.
У меня есть идея о том, как преобразовать 4-битные значения в их шестнадцатеричные значения, но я не понимаю, как на самом деле разбить 32-битное значение на меньшие и более работоспособные 4-битные значения.
Например, я мог бы захотеть изменить 11111111111111111111111111111111
на 1111 1111 1111 1111 1111 1111 1111 1111
, чтобы иметь возможность работать с каждым из них 1111
по отдельности для преобразования каждого в F
Комментарии:
1. Вы говорите, что вам нужно преобразовать 32-разрядное целое число, но, похоже, у вас есть строка значений или какой-то другой массив из 32 значений, а не 32-разрядное целое число. Пожалуйста, поясните. Может быть, покажите объявление
hexConversion
, чтобы мы могли видеть, какие типы данных вы используете. Когда вы говорите преобразовать в «шестнадцатеричное значение», вы также имеете в виду строку?2. Это требует уточнения. Вы говорите 32-разрядное целое число, но показываете двоичное представление. Вы можете преобразовать его в шестнадцатеричный с помощью printf(), если это реальное целое число. printf(«%x», val)
3. Да, вы правы, виноват.
binaryConversion()
выдает мне строку из 32 значений, которая является репрезентативной для двоичного числа, и с помощьюhexConversion()
я надеюсь создать строку значений, представляющих шестнадцатеричное значение двоичного числа. Извините, если я неудачно сформулировал это.
Ответ №1:
«Базовый C», но, возможно, не то, что вы ищете…
binaryConversion(const char *bits, char *buf, int len) {
snprintf(buf, len, "%lx", strtol(bits, NULL, 2));
}
Более сложным решением, конкретно использующим битовые маски и сдвиги, может быть что-то вроде этого…
binaryConversion(const char *bits, char *buf, int len) {
const char *xdig = "0123456789ABCDEF";
long val = strtol(bits, NULL, 2);
int i;
for (i = 0; i < 8; i) {
int nib = val amp; 0xf;
if (len > i) buf[i] = xdig[nib];
val = val << 4;
}
}
Комментарии:
1. Здесь происходит довольно классическая раздача рыбы .