我无法从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"
我希望我解释得足够好。如果您还有问题,请告诉我。
答案 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;
}