识别位图中设置的位并以字符串形式打印它们

时间:2017-02-15 05:06:03

标签: c bitmap string-conversion

给出无符号的64位整数。 其中设置了多个位。 想要处理位图并识别位置并根据位的位置返回字符串。 例如:无符号整数是12.表示1100,表示设置第三位和第四位。这应该打印三个 function接受unsigned int并返回string。 我查看了一些代码,我不认为这是其他一些问题。

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;
}

2 个答案:

答案 0 :(得分:0)

在不编写实际代码的情况下,这里是基于64元素字符串查找表的简单算法的描述。 0 = ZERO,1 = ONE,2 = TWO ... 63 = SIXTY THREE。该表将是一个64元素的字符串数组。对于C,你可以使用char [256]创建一个静态2D数组来保存你的字符串(或者使用最大字符串+ 1的值进行优化),或者你可以在For循环中使用malloc进行动态处理

然后定义输出字符串。

然后编写For循环,使用位掩码迭代所有位(使用左移)如果设置了Bit,则可以将输出字符串(使用strcat)与空格和查找表的内容连接起来那个位置。

以下是关于如何进行连接的简短代码片段:(确保输出字符串在outputstring变量中有足够的内存来容纳最大的字符串。如果你想更复杂并优化内存使用,你可以使用malloc和realloc,但是当不再需要时你必须处理释放内存。

#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”,然后在下一次迭代时,第4位将被检测为设置,输出将被附加为“三个” ”

注意:因为这似乎是一个学术问题,我想指出这里存在复杂性与空间权衡的经典案例。我上面的描述是以空间为代价的最小复杂性。这意味着,在这些字符串中,您将拥有64个带冗余的字符串。例如:TWENTY TWO,THIRTY TWO,FOURTY TWO,FIFTY TWO和SIXTY TWO都包含字符串“TWO”。可以通过使用一半的字符串来优化空间:ZERO,ONE,通过NINETEEN,然后是TWENTY,THIRTY,FORTY,FIFTY,SIXTY。但是,对于大于TWENTY的位,索引逻辑会更复杂。对于第21位,您需要连接TWENTY和ONE。

答案 1 :(得分: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]);

一个问题。在第一个单词之后,您还需要添加一个空格,以便您可能想要跟踪它。

此代码检查数字的前10位,并打印出测试用例的三个。请注意,它不会进行任何内存清理。

#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);
}