Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 将二进制转换为十六进制值(32位)_C++_Binary_Hex - Fatal编程技术网

C++ 将二进制转换为十六进制值(32位)

C++ 将二进制转换为十六进制值(32位),c++,binary,hex,C++,Binary,Hex,我正在尝试将二进制值转换为十六进制值,我得到了下面的代码,它在高达28位时工作良好,但在32位时工作不好 代码如下 int main() { long int longint=0; string buf; cin>>buf; int len=buf.size(); for(int i=0;i<len;i++) { longint+=( buf[len-i-1]-48) * pow((double)2,i);

我正在尝试将二进制值转换为十六进制值,我得到了下面的代码,它在高达28位时工作良好,但在32位时工作不好

代码如下

int main()
{
    long int longint=0;
    string buf;
    cin>>buf;
    int len=buf.size();
    for(int i=0;i<len;i++)
    {
        longint+=( buf[len-i-1]-48) * pow((double)2,i);
    }
    cout<<setbase(16);
    cout<<longint;
    return 0;
}
intmain()
{
long int longint=0;
字符串buf;
cin>>buf;
int len=buf.size();

对于(int i=0;i而言,问题似乎与使用
pow
有关,如果我没记错的话,它使用浮点数学..您可能会遇到溢出问题

计算二次幂的更优雅的方法是使用位移位:

2^0 = 1 << 0 = 1
2^1 = 1 << 1 = 2
2^2 = 1 << 2 = 4
2^n = 1 << n

2^0=1如果我没记错的话,
pow
的使用似乎是个问题。它使用浮点数学。您可能会遇到溢出问题

计算二次幂的更优雅的方法是使用位移位:

2^0 = 1 << 0 = 1
2^1 = 1 << 1 = 2
2^2 = 1 << 2 = 4
2^n = 1 << n

2^0=1如果我没记错的话,
pow
的使用似乎是个问题。它使用浮点数学。您可能会遇到溢出问题

计算二次幂的更优雅的方法是使用位移位:

2^0 = 1 << 0 = 1
2^1 = 1 << 1 = 2
2^2 = 1 << 2 = 4
2^n = 1 << n

2^0=1如果我没记错的话,
pow
的使用似乎是个问题。它使用浮点数学。您可能会遇到溢出问题

计算二次幂的更优雅的方法是使用位移位:

2^0 = 1 << 0 = 1
2^1 = 1 << 1 = 2
2^2 = 1 << 2 = 4
2^n = 1 << n

2^0=1作为Nathan的帖子,当你这样修改代码时,它会显示正确

longint += (buf[len-i-1]-'0') << i;

longint+=(buf[len-i-1]-'0')作为Nathan的帖子,在这样更改代码时,它会显示正确

longint += (buf[len-i-1]-'0') << i;

longint+=(buf[len-i-1]-'0')作为Nathan的帖子,在这样更改代码时,它会显示正确

longint += (buf[len-i-1]-'0') << i;

longint+=(buf[len-i-1]-'0')作为Nathan的帖子,在这样更改代码时,它会显示正确

longint += (buf[len-i-1]-'0') << i;

longint+=(buf[len-i-1]-“0”)如果您使用的是int32,当您使用它32个字节时,它超出了范围,请尝试使用int64,即long-long

    unsigned long long longint=0; //Change Here
    string buf;
    cin>>buf;
    int len=buf.length();
    for(int i=0;i<len;i++)
    {
        longint+=( buf[len-i-1]-48) * pow((double)2,i);
    }
    cout<<setbase(16);
    cout<<longint;
unsigned long longint=0;//此处更改
字符串buf;
cin>>buf;
int len=buf.length();

对于(inti=0;i您使用的是int32,当您使用它32个字节时,它超出了范围,请尝试使用int64,即long-long

    unsigned long long longint=0; //Change Here
    string buf;
    cin>>buf;
    int len=buf.length();
    for(int i=0;i<len;i++)
    {
        longint+=( buf[len-i-1]-48) * pow((double)2,i);
    }
    cout<<setbase(16);
    cout<<longint;
unsigned long longint=0;//此处更改
字符串buf;
cin>>buf;
int len=buf.length();

对于(inti=0;i您使用的是int32,当您使用它32个字节时,它超出了范围,请尝试使用int64,即long-long

    unsigned long long longint=0; //Change Here
    string buf;
    cin>>buf;
    int len=buf.length();
    for(int i=0;i<len;i++)
    {
        longint+=( buf[len-i-1]-48) * pow((double)2,i);
    }
    cout<<setbase(16);
    cout<<longint;
unsigned long longint=0;//此处更改
字符串buf;
cin>>buf;
int len=buf.length();

对于(inti=0;i您使用的是int32,当您使用它32个字节时,它超出了范围,请尝试使用int64,即long-long

    unsigned long long longint=0; //Change Here
    string buf;
    cin>>buf;
    int len=buf.length();
    for(int i=0;i<len;i++)
    {
        longint+=( buf[len-i-1]-48) * pow((double)2,i);
    }
    cout<<setbase(16);
    cout<<longint;
unsigned long longint=0;//此处更改
字符串buf;
cin>>buf;
int len=buf.length();
对于(int i=0;i
  • 这是因为您强制了
    (buf[len-i-1]-48)*pow((double)2,i)

    要转换成双字节

    双字节
    是8个字节长,
    但它必须存储额外的信息,
    它不能完全充电以表示0x8000000,
    您可以找到更多信息

    和您最后的
    (buf[len i-1]-48)*pow((double)2,i)

    (当我31岁时)表达式已溢出
    但是从4294967295.0000000(即0xffffffff)转换为int时发生了一些事情,结果是0x8000000,但我很抱歉我不知道为什么(请参考TonyK的评论)。

    您可以将其更改为

    longint+=(长int)((buf[len-i-1]-48)*pow(2,i))

  • 为什么要减48?
    因为“0”的ascii是48,所以要将文字“0”转换为数字0,必须这样做

  • 这是因为您强制了
    (buf[len-i-1]-48)*pow((double)2,i)

    要转换成双字节

    双字节
    是8个字节长,
    但它必须存储额外的信息,
    它不能完全充电以表示0x8000000,
    您可以找到更多信息

    和您最后的
    (buf[len i-1]-48)*pow((double)2,i)

    (当我31岁时)表达式已溢出
    但是从4294967295.0000000(即0xffffffff)转换为int时发生了一些事情,结果是0x8000000,但我很抱歉我不知道为什么(请参考TonyK的评论)。

    您可以将其更改为

    longint+=(长int)((buf[len-i-1]-48)*pow(2,i))

  • 为什么要减48?
    因为“0”的ascii是48,所以要将文字“0”转换为数字0,必须这样做

  • 这是因为您强制了
    (buf[len-i-1]-48)*pow((double)2,i)

    要转换成双字节

    双字节
    是8个字节长,
    但它必须存储额外的信息,
    它不能完全充电以表示0x8000000,
    您可以找到更多信息

    和您最后的
    (buf[len i-1]-48)*pow((double)2,i)

    (当我31岁时)表达式已溢出
    但是从4294967295.0000000(即0xffffffff)转换为int时发生了一些事情,结果是0x8000000,但我很抱歉我不知道为什么(请参考TonyK的评论)。

    您可以将其更改为

    longint+=(长int)((buf[len-i-1]-48)*pow(2,i))

  • 为什么要减48?
    因为“0”的ascii是48,所以要将文字“0”转换为数字0,必须这样做

  • 这是因为您已强制将
    (buf[len-i-1]-48)*pow((double)2,i)

    转换为double

    double长度为8字节,
    但它必须存储额外信息,
    它不能完全充电以表示0x8000000,