【问题标题】:Extracting specific bits from an integer and saving them into a string in C?从整数中提取特定位并将它们保存到 C 中的字符串中?
【发布时间】:2018-08-26 19:03:27
【问题描述】:

我无法从 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"

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

【问题讨论】:

  • 请不要从左数位。 0th 位是我们通常写的最右边的位,最不重要。所以你的掩码01111111111111111111100000000000 是第 11 位到第 30 位。至于问题,你可以通过逐位移动将其转换为字符串。我敢肯定有一个类似的问题。
  • 是否有任何理由将其保存为 ASCII 二进制字符串?为什么不将其保存为二进制并编写一个函数将其打印为 ASCII 二进制字符串?这样一来,Integer & Mask 就很简单了。

标签: c string integer save bit


【解决方案1】:
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;
}

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2018-05-12
    • 2019-04-15
    • 2022-01-21
    • 1970-01-01
    • 2022-08-10
    • 2020-06-15
    • 2018-07-30
    相关资源
    最近更新 更多