我一直在研究这个十六进制转换器,程序中的某处似乎存在逻辑错误。我使用g ++工具在Ubuntu上运行它,每次运行t程序时,它都会给我一大堆垃圾值。我无法弄清楚垃圾值的来源,也无法找到逻辑错误的来源。我是编程的新手,所以请帮我弄清楚我的错误。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int bin[20],finhex[10],num,bc=0,i,j,k,l=0,r=10,n=1,binset=0,m=0;
int hex[16]= {0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111};
char hexalph='A';
cout<<"\nEnter your Number: ";
cin>>num;
while(num>0)
{
bin[bc]=num%2;
num=num/2;
bc++;
}
if(bc%4!=0)
bc++;
for(j=0;j<bc/4;j++)
for(i=0;i<4;i++)
{
binset=binset+(bin[m]*pow(10,i));
m++;
}
for(k=0;k<16;k++)
{
if(hex[k]==binset)
{
if(k<=9)
finhex[l]=k;
else
while(n>0)
{
if(k==r)
{
finhex[l]=hexalph;
break;
}
else
{
hexalph++;
r++;
}
}
l++;
r=10;
binset=0;
hexalph='A';
break;
}
}
while(l>=0)
{
cout<<"\n"<<finhex[l];
l--;
}
return 0;
}
答案 0 :(得分:1)
foreach($results as $result) { foreach ($result->TheAuthor as $author) { $author->makeVisible("password"); } }
请允许我将这些值翻译成十进制:
int hex[16]= {0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111};
如果您希望将它们视为二进制文字,那么您需要指定它们或将它们放在编译器理解的其他形式中:
int hex[16] = {0, 1, 8, 9, 64, 65, 72, 73, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111};
答案 1 :(得分:0)
虽然Ignacio Vazquez-Abrams正确地暗示了您的hex
的某些初始值设定项(由于前缀0
)是八进制常量,但他却忽略了您选择了一种特殊的但可能的方式来将二进制文字表示为仅包含数字0和1的十进制常量。因此,您只需从所有大于7的常量中删除前缀0
:
int hex[16] = {0000,0001,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111};
然后,将字符'A'
等存储在int finhex[]
中,并用cout<<"\n"<<finhex[l]
输出它们-但是这种方式不是打印A
,而是打印其字符代码值,e。 G。以ASCII 65
表示。为了真正输出字符A
等,我们可以将finhex
数组元素类型更改为char
:
char bin[20],finhex[10]; int num,bc=0,i,j,k,l=0,r=10,n=1,binset=0,m=0;
-,但因此我们还必须将数字0到9作为字符代码值存储:
if (k<=9)
finhex[l]='0'+k;
此外,加上线条
if(bc%4!=0)
bc++;
您正确地考虑了转换需要4倍的倍数的问题,但是您忽略了可能遗漏多个位,并且bin[]
的其他元素未初始化的情况,因此请更改为:
while (bc%4!=0) bin[bc++] = 0;
此外,还省略了两个内部for
循环(适当缩进)周围的大括号;由于C ++不是Python,因此缩进没有意义,并且没有大括号,只有缩进的for
循环中的第一个嵌套在外部for
循环中。
最后的while
循环应被淘汰,并超出大的for
循环。其中还存在一个索引错误,因为finhex
数组是用l
进行索引的,索引{1}到高;您可以将其更改为:
while (l--) cout<<finhex[l];
cout<<"\n";