gpt4 book ai didi

c - 确定作为二进制字符串给出的类型的大小的有效方法是什么?

转载 作者:行者123 更新时间:2023-12-01 12:59:18 26 4
gpt4 key购买 nike

首先,让我们假设我已经对字节序进行了分类,并且先验地知道了类型的大小。

这就是我正在做的事情:我有一个函数 bs2i(char *bitStr),它接收一个表示带符号的 char/short/int/long 二进制的字符数组。该数组可以是任意长度 <= sizeof(long long)

我想做的是获取 bitStr[0] 并将其设置为符号位,这样如果我执行类似 char val = bs2i("111") 的操作,它就不会被截断.在这种情况下,该函数应返回 -125,因为这些位将设置为“000...00010000011”。为此,我需要知道最终类型需要多长时间,以便我可以将 msb 移到正确的位置。

这是我目前所拥有的:

size_t size = (((strlen(bitStr)-1)>>3)+1)<<3;

但我刚刚意识到这只适用于字符和短裤。例如,长度为 17 的字符串应该返回大小 32,但使用此方法只会返回 24。是否有一种有效的方法来确定合适的长度?

作为引用,这里是完整的函数:

long long bs2i(char *bitStr) {
long long val = 0l;
size_t len = (((strlen(bitStr) - 1) >> 3) + 1) << 3;
char msb = *bitStr & 1;
bitStr++;
while (*bitStr) {
val = (val << 1l) | (*bitStr & 1);
bitStr++;
}
val = (msb << len-1l) | val; /* Use MSB as sign bit */

return val;
}

加分,我猜,如果有一个不需要类型大小先验知识的好方法。

最佳答案

听起来您想找到最小的 2 的幂,即 8 位数的倍数,它可以容纳与字符串中的字符一样多的位数。如果最多 64 位,为什么不在字符串长度上使用 开关

switch((strlen(bitStr) - 1) >> 3) {
case 0: return 8; /* strlen <= 8 */
case 1: return 16; /* strlen <= 16 */
case 2:
case 3: return 32; /* strlen <= 32 */
case 4:
case 5:
case 6:
case 7: return 64; /* strlen <= 64 */
default: return 0;
}

或者,你可以试试这个:

int reqIntSz(char *bitStr)
{
int len = strlen(bitStr);
int res = 8;
while ( len > res ) res <<= 1;
return res;
}

关于c - 确定作为二进制字符串给出的类型的大小的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com