Я работаю над функцией print_selected(int x)
, которая принимает x
, затем извлекает биты 5, 6, 7 и 8 (начиная с бита 0 справа)
затем распечатайте их в обоих двоичных файлах, затем в шестнадцатеричном формате.
Существует вспомогательная функция, int2bin(int n)
в функции print_selected(int x)
и int2bin(int)
возвращает массив типов символов в s
.
Проблема в том, что я могу правильно распечатать двоичное число битов 5, 6, 7 и 8 бит, однако шестнадцатеричное число возвращает какое-то странное число (из-за проблемы утечки памяти?).
Я сильно сомневаюсь, что char* s = int2bin(x)
и free(s)
в print_selected(int)
могут быть проблемой, но я не знаю, в какую часть я должен внести изменения, чтобы правильно распечатать правильное шестнадцатеричное число.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
// takes integer and returns char array with 32 binary number.
char* int2bin(int n)
{
int nbits = sizeof(n) * 8;
char *s = malloc(nbits + 1);
s[nbits] = '\0';
unsigned int u = *(unsigned int*)&n;
int i;
unsigned int mask = 1 << (nbits - 1);
for (i = 0; i < nbits; i++, mask >>= 1)
s[i] = ((u & mask) != 0) + '0';
return s;
}
// takes an integer and print in "binary" and "hexadecimal".
void print_selected(int x)
{
int hex[4]; // to store the 4 bits of (5,6,7,8)
int i;
char *s = int2bin(x); // I think this part makes problem?
printf("bits 5 to 8 in bin: ");
for (i = 23; i <= 26; i++)
{
printf("%d", s[i] - '0');
hex[i] = s[i] - '0';
}
free(s); // I think this part makes problem?
printf("\n");
int j = 3; // since we already know the number of bits,
int sum = 0;
for (i = 0; i <= 3; i++)
{
sum = sum + (hex[i] * pow(2, j));
j--;
}
printf("in hex: 0x%x\n", sum);
}
int main(void)
{
int a = 278;
print_selected(a);
}