#c #bit #twos-complement #uint16
#c #бит #двойки-дополнение #uint16
Вопрос:
Я пытаюсь отобразить строковое представление дополнения int16_t к двум. Я нахожу дополнение к двум с помощью (uint16_t)~value 1;
Как мне добавить 16 бит в строку?
char* getBits(const int16_t value) {
uint16_t complement = (uint16_t)~value 1;
char bits = malloc(16*sizeof(char*))
for (int i = 0; i < 16; i ) {
bits[i] = // something
}
return bits;
}
Комментарии:
1. Добавьте
''
в конецbits
и используйтеprintf("%s", bits)
.2. бит пуст??
3. Пожалуйста, не редактируйте свой исходный код на основе ответа здесь. Это делает опубликованные ответы бессмысленными (например, изменение Бармара с
char
наchar *
). Вы можете отредактировать свой вопрос и добавить дополнительный код внизу. Или вы можете показать свой окончательный / обновленный ответ в своем собственном ответе [если хотите].
Ответ №1:
Сдвиньте complement
правые i
биты и проверьте, является ли младший бит 0
или 1
и введите соответствующий символ bits
.
bits[i] = (complement >> i) amp; 1 ? '1' : '0';
Кроме того, вам необходимо выделить дополнительный символ в вашей строке для нулевого терминатора. И bits
должен быть указателем, а размер элемента sizeof(char)
— нет sizeof(char*)
.
char *bits = malloc(17*sizeof(char));
bits[16] = 0;
Нет необходимости использовать формулу (uint16_t)~value 1
. Преобразование подписанного int в unsigned int автоматически возвращает его значение дополнения twos. Таким образом, вы можете просто сделать:
uint16_t complement = (uint16_t)value;
Комментарии:
1. Почему не malloc((16 1)*sizeof(char))
2. почему sizeof(char)?
3. Я обычно не удаляю это, когда операционная система использует его. Это излишне, но имеет смысл.
Ответ №2:
В вашем коде много проблем, и он даже не компилируется. Вам нужно узнать, что является указателем, а что нет. Как использовать malloc и где хранить его результат. Лучший способ — прочитать хорошую книгу на Си.
#include <stdint.h>
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
char* getBits(const int16_t value)
{
uint16_t complement = value;
char *bits = malloc(sizeof(value) * CHAR_BIT 1);
char *wrk = bits;
if(bits)
{
for (unsigned i = 1 << 15; i; i >>= 1)
{
*wrk = (complement amp; i) ? '1' : '0';
}
*wrk = 0;
}
return bits;
}
int main(void)
{
for(int i = 0; i > -15; i --)
{
char *bits;
printf("%d - %sn", i, (bits = getBits(i)));
free(bits);
}
}