2017-02-15 4 views
0

с учетом 64-битного целого числа без знака. , который содержит несколько бит. хотите обработать растровое изображение и идентифицировать позицию и вернуть строку в соответствии с положением, где бит. пример: целое число без знака равно 12. означает 1100, который подразумевает, что установлены третий бит и четвертый бит. это должно печатать THREE FOUR функция принимает unsigned int и возвращает строку. Я посмотрел несколько фрагментов кода, и я не вижу в этом ни одного другого вопроса.идентифицируют биты, установленные в растровом изображении, и печатают их в строке

char* unsigned_int_to_string(unsigned long int n) 
{ 
    unsigned int count = 0; 
    while(n) 
    { 
     int i, iter; 
     count += n & 1; 
     n >>= 1; 
    } 

    /*** Need help to fill this block ***/ 
    /** should return string THREE FOUR***/ 
} 


#include <stdio.h> 
int main() 
{ 
    unsigned long int i = 12; 
    printf("%s", unsigned_int_to_sring(i)); 
    return 0; 
} 
+0

Почему вы определили функцию для возврата 'char *', в то время как вы фактически возвращаете 'unsigned int'? – Matso

+0

Matso, определите количество битов, их позиции и выводимые строки из них. который я пробовал. –

ответ

0

Не записывая фактический код, здесь приведено описание простого алгоритма, основанного на таблице поиска элементов из 64 элементов. 0 = ZERO, 1 = ONE, 2 = TWO ... 63 = SIXTY THREE. Эта таблица будет массивом из 64 элементов. Для C вы можете создать статический 2D-массив, используя char [256], чтобы удерживать ваши строки (или оптимизировать, используя значение самой большой строки + 1), или вы можете сделать динамическое использование с помощью malloc в For Loop)

Затем вы определяете свою выходную строку.

Затем вы пишете цикл «For Loop», итерации по всем битам с использованием битовой маски (с использованием сдвига влево), если бит установлен, вы можете объединить вашу выходную строку (используя strcat) с пробелом и содержимым вашей таблицы поиска для этой позиции бита.

Вот краткий фрагмент кода о том, как вы будете выполнять конкатенацию: (Убедитесь, что в строке вывода имеется достаточно памяти в переменной outputstring для хранения самой большой строки. Если вы хотите быть более сложным и оптимизировать использование памяти, вы можно использовать таНос и перераспределить, но вам приходится иметь дело с не освобождая память, когда он больше не нужен.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[80]; 
    strcpy (str,"these "); 
    strcat (str,"strings "); 
    strcat (str,"are "); 
    strcat (str,"concatenated."); 
    puts (str); 
    return 0; 

}

в вашем случае, бит 3 будет встречаться в качестве первого набора бит и строка вывода затем будет содержать «ТРИ», затем на следующем итерационном бите будет обнаружен как установленный, и выход будет добавлен как «THREE FOUR».

Примечание: поскольку это, как представляется, является академической проблемой, я хотел бы указать, что здесь существует классический случай сложности против космического компромисса. Мое описание выше было минимальной сложностью за счет пространства. Значит, у вас будет 64 строки с избыточностью во многих из этих строк. Например: ДВАДЦАТЬ ДВА, ТРИДЦАТЬ ДВА, ЧЕТЫРЕ ДВА, ПЯТЬ ДВЕ И ШЕСТЬДЕСЯТ ДВА, все содержат строку «ДВЕ». Пространство можно оптимизировать, используя половину строк: ZERO, ONE, через NINETEEN, затем ДВАДЦАТЬ, ТРИДЦАТЬ, СОРОК, ПЯТЬ, ШЕСТЬДЕСЯТ. Однако ваша логика индексирования будет более сложной для бит, превышающий ДВАДЦАТЬ. для бит 21 вам необходимо объединить ДВАДЦАТЬ И ОДИН.

0

Вы можете перебирает его, имея таблицу поиска, которая имеет представление слово для каждого бита вас интересует.

char* bit_to_word[10] = { "ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN" }; // and so forth... 

Тогда в чеке функции каждый бит, и если он установлен, сростить соответствующее слово из вашего массива bit_to_word. Вы можете смело сделать это, используя функцию strcat_s.

strcat_s(number_string, BUF_SIZE, bit_to_word[i]); 

One gotcha. После первого слова вы также захотите добавить пробел, чтобы вы могли отслеживать это.

Этот код проверяет первые 10 бит номера и печатает THREE FOUR для тестового примера. Имейте в виду, что это не делает никакой очистки памяти.

#include <stdio.h> 
#include <string.h>  

#define BUF_SIZE 2048 

char* bit_to_word[10] = { "ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN" }; 

char* unsigned_int_to_string(unsigned long int n) 
{ 
    char* number_string = (char*)malloc(BUF_SIZE); 
    memset(number_string, 0, BUF_SIZE); 

    int first_word = 1; 
    unsigned long int tester = 1; 
    int err; 
    for (unsigned long int i = 0; i < 10; i++) 
    { 
     if (tester & n) 
     { 
      if (!first_word) 
      { 
       strcat_s(number_string, BUF_SIZE, " "); 
      } 
      err = strcat_s(number_string, BUF_SIZE, bit_to_word[i]); 
      if (err) 
      { 
       printf("Something went wrong...\n"); 
      } 
      first_word = 0; 
     } 
     tester <<= 1; 
    } 

    return number_string; 
} 

int main(int argc, char** argv) 
{ 
    char* res = unsigned_int_to_string(0b1100); 
    printf("%s\n", res); 
} 
Смежные вопросы