Arrays 带数组的二进制十进制转换

Arrays 带数组的二进制十进制转换,arrays,c,binary,decimal,Arrays,C,Binary,Decimal,你有没有一个简单的想法,我们如何在C中从一个二进制数到一个十进制数,而不做任何除法(因为我可以有非常大的数字),也许只使用掩码(&,|,>)。 我有一张这样的桌子: tab[20] = {1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,0,1}; 我希望: tab[6] = {5,9,6,2,5,3}; 这是可以做到的吗?谢谢你的帮助 关于如何从二进制数变为十进制数的想法(可以有非常大的数字) 对于每个二进制数字,将十进制目标缩放2并添加数字 伪代码 some_int

你有没有一个简单的想法,我们如何在C中从一个二进制数到一个十进制数,而不做任何除法(因为我可以有非常大的数字),也许只使用掩码(&,|,>)。 我有一张这样的桌子:

tab[20] = {1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,0,1};
我希望:

tab[6] = {5,9,6,2,5,3};
这是可以做到的吗?谢谢你的帮助

关于如何从二进制数变为十进制数的想法(可以有非常大的数字)

对于每个二进制数字,将十进制目标缩放2并添加数字

伪代码

some_integer_type tab2[] = {1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,0,1};
some_integer_type tab10[big_enough];

zero fill tab10[]
for (each i element in tab2[] starting with index 0) {
  // scale tab10[] by 2 and add tab2[]
  carry = tab2[i]
  for (each j element in tab10[] starting with the last index) {
    sum = (tab10[j] << 1) | carry;
    if (sum >= 10) {
      sum -= 10;
      carry = 1;
    } else {
      carry = 0;
    }
    tab10[i] = sum;
  }
}
print tab10[]
some_integer_type tab2[]={1,0,0,1,0,0,1,1,1,0,0,0,1,0,0,1,1,1,0,1};
一些整型选项卡10[足够大];
零填充选项卡10[]
for(tab2[]中的每个i元素以索引0开始){
//将tab10[]缩放2,然后添加tab2[]
进位=表2[i]
for(tab10[]中的每个j元素从最后一个索引开始){
总和=(表10[j]=10){
总和-=10;
进位=1;
}否则{
进位=0;
}
表10[i]=总和;
}
}
打印选项卡10[]

要仅使用
&,|,>
执行
=,-=10
,请创建帮助函数:.

无除法,最多64位。这是“大”。使用
sprintf()
完成从bin到dec的操作。然后可以将该数字字符串转换为整数数组,如
选项卡[6]

char bittab[64] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
long num = 0, dupl = 1;
int i;
for (i = 0; i < sizeof bittab; i++) {
    num += dupl * bittab[i];
    dupl *= 2;
}
char decstring[30];
sprintf(decstring, "%ld\n", num);
for (i = 0; i < strlen(decstring); i++)
    printf("%d\n", decstring[i] - '0');
这可以写入dectab[]数组,不包括空终止符字节


(我使位升序以保持大小打开。)

什么是“制表符”类型?您可以使用“0b”使用二进制定义变量。例如:uint32_t val=0b1001000110011101;然后,要分隔数字,可以使用模(%)和除法。e、 g.:uint32\u t位\u 1=val%10;如果可以,请不要将布尔值存储到字节数组中。它在内存使用方面没有优化Genote:
long
可能只有32位,并且可能在这里使用无符号类型。考虑<代码>未签名的长long < /代码>
3
2
7
6
7
-38