我有一个类似于“10100010”的字符串,它等于162十进制或0xA2十六进制。我需要找到一种方法来计算C中的其中一个值。或者只是一种在C中获得此值的方法:0b(字符串) - 0b10100010
我试图通过这样做将每个位(char)转换为int:String [0] - '0',并使用循环来mannualy计算二进制数的值,类似这样,但它没有工作..
for (i=0,n=n_c; i<n_c; i++,n--)
{
decimal_value=decimal_value+ pow( (val[i]-'0') , (n-1) );
printf("%d ", pow( (int) ((val[i]-'0')) , (n-1)));
}
在这种特殊情况下n_c = 6(6位)。如果字符串大于8位,我还有另一个问题,但现在让我们关注这个“简单”的情况。
你可以帮助我吗?答案 0 :(得分:2)
有一个bin to dec的例子:
{{1}}
输出:x = 100; y = 4; z = 17
答案 1 :(得分:0)
我认为使用位操作可能会让你获得更好的结果。
以下代码不是最优化的,也不是广告素材,但使用按位运算符(<<
和|
)演示了直接解决问题的方法。
#include <stdio.h>
/*
Returns the binary number found at the beginning of the string (if any).
No error checks are performed
*/
unsigned long parse_binary_string(char* str) {
unsigned long value = 0;
while (1) {
if (*str == '0')
value = value << 1;
else if (*str == '1')
value = (value << 1) | 1;
else
break;
str++;
}
return value;
}
int main(int argc, char const* argv[]) {
char string[] = "01101010";
printf("The result for %s is %lu\n", string, parse_binary_string(string));
return 0;
}
答案 2 :(得分:0)
您的方法不起作用的原因是 1.您需要使用(i)* 2 ^(n-1)
2.您使用错误的方式打印结果。pow函数的定义是double pow(double x,double y);
Pls try this:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int n_c = 6;
char val[10]={'0','1','0','1','0','1','0',};
double decimal_value = 0;
int n;
for (i=0,n=n_c; i<n_c; i++,n--)
{
decimal_value=decimal_value+ pow( (val[i]-'0')*2 ,(n-1) );
printf("%lf \n", pow( (((val[i]-'0'))*2) , (n-1)));
}
printf("%lf \n", decimal_value);
}
答案 3 :(得分:0)
最好使用strtol()
,但如果你想推出自己的代码:
将一串基本N字符转换为整数以便遍历每个数字的简单方法,并将其添加到已乘以基数的总和中。
OP仍然需要添加一些代码并确定如何处理错误的输入。帮助你入门的东西。
// convert '0' --> 0, 'A' --> 10, 'z' --> 35, etc.
// return -1 on failure
int covert_char_to_digit(char ch) {
TBD code
}
int string_to_int(const char *s, int base) {
if (test_if_valid_base(base)) {
fprintf(stderr, "Invalid base %d\n", base);
return 0;
}
int sum = 0;
while (*s) {
int ch = covert_char_to_digit(*s);
if (ch < 0 || ch >= base) {
fprintf(stderr, "Invalid digit\n");
return 0;
}
// Does OP want to detect pending overflow
// Here is a good place for such code.
sum = sum*base + ch;
s++;
}
return sum;
}