从整数中提取特定位并将其保存到C语言的字符串中?

时间:2018-08-26 19:03:27

标签: c string integer save bit

我无法从32位长的整数中提取特定位并将这些特定位保存到字符串中。

为了更好地解释我的问题,我将对此进行解释:

好的,假设我有这个整数:

01010101010101010101000011010100

我想从第2位(包括)到第21位(包括)提取(从MSB到LSB)。

所以我可以简单地创建一个掩码,该掩码将仅保留我想要的20位,而将所有其他位清零。

Integer: 01010101010101010101000011010100
Mask:    01111111111111111111100000000000

New integer = Integer & Mask = 01010101010101010101000000000000

在那之后,我不知道如何将这20位保存到字符串中。

好的,现在让我们说说我们有一个可以容纳100个字符的char数组。

然后我需要将整数中的这20位复制到char数组中,以便仅将这20位显示为文本。应该是这样的:

printf("Text: %s", string); -> "Text: 10101010101010101010"

我希望我解释得足够好。如果您还有问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

unsigned long long extractbits(unsigned long long data, unsigned start, unsigned end)
{
    unsigned long long mask;
    if(start > end)
    {
        unsigned tmp = start;
        end = start;
        start = tmp;
    }
    mask = (end == sizeof(unsigned long long) * 8 - 1) ? ~0ULL : (1ULL << (end + 1))) - 1;
    return ((data & mask) >> start);
}

char *to_string(char *buff, unsigned long long data)
{
    char *cptr = buff;
    char *sptr = buff;
    while(data)
    {
        *cptr++ = (data & 1) ? '1' : '0';
        data >>= 1;
    }
    *cptr-- = 0;
    while(cptr > buff)
    {
        char tmp = *cptr;
        *cptr-- = *buff;
        *buff++ = tmp;
    }
    return sptr;
}

int main()
{
    char buff[25];
    printf("%s\n", to_string(buff, extractbits(0b11100011100011100011ULL, 4, 17)));

    return 0;
}