Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有字符数组的二进制到十进制转换器_C++_Gcc - Fatal编程技术网

C++ 具有字符数组的二进制到十进制转换器

C++ 具有字符数组的二进制到十进制转换器,c++,gcc,C++,Gcc,创建二进制到十进制的转换器;把大部分的裸骨头放下来,但我有一个问题——程序从左到右读取二进制数,而不是从右到左读取二进制数(通常通过手写来计算二进制数)。因此,诸如“1111”、“10001”和“10101”之类的输入显示为其正确的十进制答案,但诸如“10011”之类的某些输入显然是不正确的 TL;DR哪种方式最适合翻转循环通过字符数组的方式 示例代码: for (i = 0; i < 33 && binary[i] != '\0'; i++, power++) { i

创建二进制到十进制的转换器;把大部分的裸骨头放下来,但我有一个问题——程序从左到右读取二进制数,而不是从右到左读取二进制数(通常通过手写来计算二进制数)。因此,诸如“1111”、“10001”和“10101”之类的输入显示为其正确的十进制答案,但诸如“10011”之类的某些输入显然是不正确的

TL;DR哪种方式最适合翻转循环通过字符数组的方式

示例代码:

for (i = 0; i < 33 && binary[i] != '\0'; i++, power++)
{
  if (binary[i] == '0')
    continue;

  else if (binary[i] == '1')
    decimal = pow (2,power) + decimal;

  else
  {
  cout << "Invalid input." << endl;
  return 0;
  }
}
for(i=0;i<33&&binary[i]!='\0';i++,power++)
{
if(二进制[i]=“0”)
继续;
else if(二进制[i]=“1”)
十进制=功率(2,功率)+十进制;
其他的
{

cout您可以使用以下命令从头到尾读取数组

int pos_of_zero = strlen(binary);

for(int i = pos_of_zero - 1; i > -1;  --i, power++)
{
   // ....

从您上面编写的代码中可以看出,您的字符串可能正好是33位数字,或者如果它较短,则将以null结尾。我之所以这样问是因为这有点奇怪,如果(例如)您可以使其始终以null结尾,则会更好。这将简化代码

但是如果是这样的话,那么下面的代码应该可以工作

// find the number of digits
int num_digits = 0;
while (num_digits < 33 && binary[num_digits] != '\0')
    ++num_digits;

// now we have the number of digits we can ...
// ... loop backwards through the string
for (int i = num_digits; i > 0; )
{
    --i;
    if (binary[i] == '0')
        continue;

    else if (binary[i] == '1')
        decimal = pow (2,power) + decimal;

    else
    {
        cout << "Invalid input." << endl;
        return 0;
    }
}
//查找位数
int num_位=0;
while(num_digits<33&&binary[num_digits]!='\0')
++数字;
//现在我们有了数字,我们可以。。。
//…在字符串中向后循环
对于(int i=num_位;i>0;)
{
--一,;
if(二进制[i]=“0”)
继续;
else if(二进制[i]=“1”)
十进制=功率(2,功率)+十进制;
其他的
{

cout您可以执行以下操作

for (i = strlen(binary) - 1; i >= 0; --i) {

}
以这种方式,如果您有一个二进制数“10011”,for循环将按如下顺序遍历位:1->1->0->0->1

通过避免调用pow函数,可以更有效地计算二进制数的十进制值

for (int i = 0, decimal = 0; i < strlen(binary); ++i)
    decimal = decimal*2 + (binary[i] - '0'); 
for(int i=0,decimal=0;i
这会取代我的另一个for循环吗?因为当我尝试这样做时,会得到“无效输入”每次。和另一个答案一样,我每次都会得到“无效输入”。您需要调整我给出的代码部分以适合您的实现。您可能正在访问二进制数组的位置I,该位置I不是二进制数的一部分。我试图说的是,for循环可以从0到(大小\二进制-1)或从(size_of_binary-1)到0。或者您仍然可以从0到(size_of_binary-1)并使用公式decimal=decimal*2+(binary[i]-“0”)计算十进制值,这避免了多次调用pow()。