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