我只能使用按位运算和指针运算来解决这个问题。我正在从二进制转换为无符号整数。
我正在编写的功能是:
unsigned int atob(const char* nptr);
atob("101") 应该返回 5,atob("11000") 应该返回 24,atob("11$") 应该返回 3,atop("") 应该返回 0。
我对按位运算很陌生,所以我真的需要一些专门在该领域的帮助。
编辑:
nptr 只能递增,不允许使用其他 inc/dec。
我只能使用按位运算和指针运算来解决这个问题。我正在从二进制转换为无符号整数。
我正在编写的功能是:
unsigned int atob(const char* nptr);
atob("101") 应该返回 5,atob("11000") 应该返回 24,atob("11$") 应该返回 3,atop("") 应该返回 0。
我对按位运算很陌生,所以我真的需要一些专门在该领域的帮助。
编辑:
nptr 只能递增,不允许使用其他 inc/dec。
unsigned bits2val(char *bits)
{
unsigned val;
for (val = 0; *bits; bits++) {
if (*bits == '1')
val = (val << 1) | 1;
else if (*bits == '0' )
val <<= 1;
else
break;
}
return val;
}
这是我的示例实现,仅使用 shift 和 ors(假设您可以++
用于字符串操作):
unsigned atob(const char *input)
{
unsigned result = 0;
unsigned currentBit = 0;
// we need to go right to left;
const char *end = input;
// make sure we only read '0's and '1's
while ((*end == '0') || (*end == '1'))
{
end++;
}
while (--end >= input) {
// check for overflow
if ((currentBit >> 3) > sizeof(result))
break;
char isCurrentBitSet = *end == '1';
unsigned setValue = (isCurrentBitSet << currentBit);
result |= setValue;
currentBit++;
}
return result;
}