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
C++ 在C+中将二进制转换为整数+;返回奇怪的结果_C++ - Fatal编程技术网

C++ 在C+中将二进制转换为整数+;返回奇怪的结果

C++ 在C+中将二进制转换为整数+;返回奇怪的结果,c++,C++,我正在尝试创建一个简单的程序来转换二进制数,例如111100010到十进制482。我在Python中也做了同样的工作,但是我找不到我在C++中做的错误。 当我执行C++程序时,我得到 -320505788 。我做错了什么 这是Python代码: def数字计数(位号): 发现=错误 计数=0 虽然未找到: 除法=位号/(10**计数) 如果分区可能引入舍入误差,尤其是当基元不是幂的时候。2.在翻译Python代码时,最好编写自己的整数求幂函数(C++中没有这样的标准函数),这看起来很有趣打印的表

我正在尝试创建一个简单的程序来转换二进制数,例如
111100010
到十进制
482
。我在Python中也做了同样的工作,但是我找不到我在C++中做的错误。

当我执行C++程序时,我得到<代码> -320505788 。我做错了什么

这是Python代码:

def数字计数(位号):
发现=错误
计数=0
虽然未找到:
除法=位号/(10**计数)
如果分区<1:
找到=真
其他:
计数+=1
返回计数
def bin_至_编号(位编号):
位数=位数计数(位数)
数字=0
对于范围内的i(位数):
exp=10**i
如果exp<10:
位数=整数(位数%10)
数字=数字*(2**i)
数字+=数字
其他:
位数=整数(位数/exp%10)
数字=数字*(2**i)
数字+=数字
打印(数字)
返回号码
bin_至_转换=111100010
bin_至_编号(bin_至_转换)
#返回482

这是C++代码:

#包括
#包括
使用名称空间std;
整数长度(整数箱号);
int bin_至int(int bin_编号);
int main()
{

cout问题是您转换了这个Python代码片段

else:
  digit = int(bit_number / exp % 10)
  digit = digit * (2 ** i)
  number += digit
为此:

else{
    if((e % 10) == 0){
        digit = 0;
    }
    else{
        digit = bin_number / (e % 10);
    }
    digit = digit * pow(2, i);
    number = number + digit;
}
换句话说,在应用
%
之后,您正试图应用
/
,并在过程中防止被零除

这是不正确的:您应该以另一种方式应用它们,如下所示:

else{
    digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}

请注意,整个条件是冗余的-您可以将其从
for
循环中删除:

for(int i = 0; i < number_length; i++){
    int e = pow(10, i);
    int digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}
for(int i=0;i

问题是您转换了这段Python代码

else:
  digit = int(bit_number / exp % 10)
  digit = digit * (2 ** i)
  number += digit
为此:

else{
    if((e % 10) == 0){
        digit = 0;
    }
    else{
        digit = bin_number / (e % 10);
    }
    digit = digit * pow(2, i);
    number = number + digit;
}
换句话说,在应用
%
之后,您正试图应用
/
,并在过程中防止被零除

这是不正确的:您应该以另一种方式应用它们,如下所示:

else{
    digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}

请注意,整个条件是冗余的-您可以将其从
for
循环中删除:

for(int i = 0; i < number_length; i++){
    int e = pow(10, i);
    int digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}
for(int i=0;i

一个问题是,main中的111100010不是以482为基数的10,而是111100010的十进制值。如果要使用二进制文字,则不需要任何代码,只需将其写出,因为整数是整数,无论其表示形式如何

如果您试图处理一个二进制字符串,您可以这样做

#include <iostream>
#include <algorithm>

using namespace std;

int bin_to_int(const std::string& binary_string);

int main()
{
    cout << bin_to_int("111100010") << endl;
    cout << 0b111100010 << endl;
    return 0;
}

int bin_to_int(const std::string& bin_string){

    //Strings index from the left but bits start from the right so reverse it
    std::string binary = bin_string;
    std::reverse(binary.begin(), binary.end());

    int number_length = bin_string.size();
    //cout << "bits " << number_length << "\n";

    int number = 0;

    for(int i = 0; i <= number_length; i++){
        int bit_value = 1 << i;
        if(binary[i] == '1')
        {
            //cout << "Adding " << bit_value << "\n";
            number += bit_value;
        }
    }

    return number;
}
#包括
#包括
使用名称空间std;
int bin_to_int(const std::string和binary_string);
int main()
{

cout一个问题是,main中的111100010不是482基数10的a,而是111100010的十进制值。如果要使用二进制文字,则不需要任何代码,只需将其写出,因为整数是整数,无论其表示形式如何

如果您试图处理一个二进制字符串,您可以这样做

#include <iostream>
#include <algorithm>

using namespace std;

int bin_to_int(const std::string& binary_string);

int main()
{
    cout << bin_to_int("111100010") << endl;
    cout << 0b111100010 << endl;
    return 0;
}

int bin_to_int(const std::string& bin_string){

    //Strings index from the left but bits start from the right so reverse it
    std::string binary = bin_string;
    std::reverse(binary.begin(), binary.end());

    int number_length = bin_string.size();
    //cout << "bits " << number_length << "\n";

    int number = 0;

    for(int i = 0; i <= number_length; i++){
        int bit_value = 1 << i;
        if(binary[i] == '1')
        {
            //cout << "Adding " << bit_value << "\n";
            number += bit_value;
        }
    }

    return number;
}
#包括
#包括
使用名称空间std;
int bin_to_int(const std::string和binary_string);
int main()
{

CUT看起来很可笑,代码> int BialythtoToint(int BITYLITE)。打印的表示与int值没有什么关系。而且总是二进制文字0B01010101010。C++中的一个整数有一个有限的范围+20亿是常见的,似乎是对你的情况。<代码>宾尼托伊int(111100010)
-这不是二进制文字,而是一个(非常大的)十进制整数;<代码> 0B11110000 10/COD>将是二进制文字。@ CAPTAINGINIRAFE不知道有二进制文字,尝试过,但它仍然给出WiRD结果。C++中<代码> POW/COD>是浮点函数,将结果截断到<代码> INT/COM>可能引入舍入误差,尤其是当基元不是幂的时候。2.在翻译Python代码时,最好编写自己的整数求幂函数(C++中没有这样的标准函数),这看起来很有趣打印的表示与int值几乎没有关系,而且总是二进制文字0B01010101010。C++中的整数有一个有限的范围+220亿是常见的,似乎对你来说是如此。<代码>宾尼toint(111100010)< /COD>——这不是二进制文字,那是一个(非常大)。十进制整数;<代码> 0B11110000 10/COD>将是二进制文字。@ CAPTAINGINIRAFE不知道有二进制文字,尝试过,但它仍然给出WiRD结果。C++中<代码> POW/COD>是浮点函数,将结果截断到<代码> INT/COM>可能引入舍入误差,尤其是当基元不是幂的时候。2.在翻译Python代码时,最好编写您自己的整数幂函数(C++中没有这样的标准函数),您甚至帮助我重新排列Python代码。当我在code::Blocks上执行此代码时,结果不一样是正常的吗?我得到的值是
506
。即使在其他联机代码中也是如此(比如Repl.it)我得到了正确的值。我想我的IDE安装有问题。你甚至帮我重新排列Python代码。当我在code::Blocks上执行此代码时,结果不一样是正常的吗?我得到的值是
506
。即使在其他在线(比如Repl.it)中也是如此我得到了正确的值。我想我的IDE安装有问题。