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++_Binary_Decimal - Fatal编程技术网

C++ 在C+中转换为二进制+;

C++ 在C+中转换为二进制+;,c++,binary,decimal,C++,Binary,Decimal,我做了一个将数字转换成二进制的函数。由于某种原因,它不起作用。它给出了错误的输出。输出为二进制格式,但对于以零结尾的二进制数,它总是给出错误的结果(至少我注意到了这一点) 请帮我修一下,这真令人沮丧 谢谢 你在倒转位子 当终止循环时,不能使用x的剩余部分作为指示器 例如,考虑4 在第一次循环迭代之后: rem == 0 converted == 0 x == 2 rem == 0 converted == 0 x == 1 第二次循环迭代后: rem == 0 converted == 0

我做了一个将数字转换成二进制的函数。由于某种原因,它不起作用。它给出了错误的输出。输出为二进制格式,但对于以零结尾的二进制数,它总是给出错误的结果(至少我注意到了这一点)

请帮我修一下,这真令人沮丧

谢谢

  • 你在倒转位子
  • 当终止循环时,不能使用x的剩余部分作为指示器 例如,考虑4

    在第一次循环迭代之后:

    rem == 0
    converted == 0
    x == 2
    
    rem == 0
    converted == 0
    x == 1
    
    第二次循环迭代后:

    rem == 0
    converted == 0
    x == 2
    
    rem == 0
    converted == 0
    x == 1
    
    然后将“转换”设置为1

    尝试:

    运行上述代码时,x作为值为129(二进制10000001)的无符号字符(8位)

    i=8
    开始,无符号字符的大小为*8。在第一个循环中,迭代
    i
    将为7。然后取
    x
    (129)并将其右移7位,得到值1。这被转换成
    ,变成1。下一次迭代,我们首先将转换后的
    乘以10(现在是10),然后将
    x
    6位右移(值变为2)并与1和(值变为0)。我们使用
    转换后的
    将0转换为10。第三次到第七次迭代做同样的事情,
    converted
    乘以10,然后从
    x
    中提取一个特定的位,或被转换成
    converted
    。在这些迭代之后,
    转换的
    为1000000


    在最后一次迭代中,第一次转换的
    乘以10,变成10000000,我们将
    x
    右移0位,得到原始值129。我们将x和1相加,得到值1。然后,1被或转换成
    ,转换成10000001。

    您实际上是在反转二进制数! to_二进制(2)将返回01,而不是10。当初始0E被截断时,它看起来与1相同

    这样做怎么样:

    unsigned long long digit = 1;
    while (x>0) {
      if (x%2)
        converted+=digit;
      x/=2;
      digit*=10;
    }
    
    你做错了;)

    第一个除法的剩余部分是二进制形式中最右边的位,使用函数它将成为最左边的位

    您可以这样做:

    unsigned long long to_binary(unsigned long long x)
    {
        int rem;
        unsigned long long converted = 0;
        unsigned long long multiplicator = 1;
    
        while (x > 0)
        {
            rem = x % 2;
            x /= 2;
            converted += rem * multiplicator;
            multiplicator *= 10;
        }
    
        return converted;
    }
    
    编辑:CygnusX1提出的代码效率稍高,但不够全面,我认为,我建议采用他的版本


    改进:我更改了while循环的停止条件,因此我们可以删除在末尾添加x的行。

    std::bitset呢


    如果要将数字显示为二进制,则需要将其格式化为字符串。据我所知,最简单的方法就是使用


    如果您的目的只是将它们显示为二进制表示形式,那么您可以尝试
    itoa
    std::bitset

    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <bitset>
    
    using namespace std;
    
    int main()
    {
        unsigned long long x = 1234567890;
    
        // c way
        char buffer[sizeof(x) * 8];
        itoa (x, buffer, 2);
        printf ("binary: %s\n",buffer);
    
        // c++ way
        cout << bitset<numeric_limits<unsigned long long>::digits>(x) << endl;
    
        return EXIT_SUCCESS;
    }
    
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    无符号长x=1234567890;
    //c路
    字符缓冲区[sizeof(x)*8];
    itoa(x,缓冲区,2);
    printf(“二进制文件:%s\n”,缓冲区);
    //C++方式
    
    cout使用std::bitset进行翻译:

    #include <iostream>
    #include <bitset>
    #include <limits.h>
    
    int main()
    {
        int     val;
        std::cin >> val;
    
        std::bitset<sizeof(int) * CHAR_BIT>    bits(val);
        std::cout << bits << "\n";
    
    }
    
    #包括
    #包括
    #包括
    int main()
    {
    int-val;
    标准:cin>>val;
    std::位集位(val);
    
    这里有一个简单的解决方案

    #include <iostream>
    using namespace std;
    int main()
    {
        int num=241; //Assuming 16 bit integer
        for(int i=15; i>=0; i--) cout<<((num >> i) & 1);
        cout<<endl;
        for(int i=0; i<16; i++) cout<<((num >> i) & 1);
        cout<<endl;
        return 0;
    }
    
    #包括
    使用名称空间std;
    int main()
    {
    int num=241;//假设为16位整数
    对于(int i=15;i>=0;i--)cout i)和1);
    
    coutIt确实令人沮丧,因为数字已经是二进制形式,不需要转换。你可以做的是打印它的位,但互联网上有大量的例子。你正在做的是转换成一个看起来像二进制的十进制数,但有错误的值。你的家庭作业到底是什么?这不是家庭作业分配。我在这里尝试学习一些东西。我知道数字已经是二进制的,但它们显示为十进制。我只想将它们显示为二进制,为此我需要将十进制表示转换为二进制。或者我需要?如果有办法将它们显示为二进制表示,我真的很想看看。谢谢复制他没有使用剩余部分作为停止条件,我认为你的代码需要一些解释。我理解,但我怀疑有基本C知识的人会。而且你错过了转换的初始化,这非常重要。你能解释最后一行吗?你使用位或、和和的目的是什么ft?还有,第一行(sizeof(x)*8)的用途是什么?理解这一点仍然有点困难…请原谅我的无知:P你能举个例子说明这是如何工作的吗?太棒了!谢谢!我现在明白了!我用gprof分析过,这似乎是最好的方法。
    itoa
    是一个非标准函数,在许多平台上都不可用(我只在windows上见过它)。
    #include <iostream>
    #include <bitset>
    #include <limits.h>
    
    int main()
    {
        int     val;
        std::cin >> val;
    
        std::bitset<sizeof(int) * CHAR_BIT>    bits(val);
        std::cout << bits << "\n";
    
    }
    
    void To(long long num,char *buff,int base)
    {
        if(buff==NULL)      return;
        long long m=0,no=num,i=1;
    
        while((no/=base)>0) i++;
        buff[i]='\0';
    
        no=num;
        while(no>0)
        {
            m=no%base;
            no=no/base;
            buff[--i]=(m>9)?((base==16)?('A' + m - 10):m):m+48;
        }
    }
    
    #include <iostream>
    using namespace std;
    int main()
    {
        int num=241; //Assuming 16 bit integer
        for(int i=15; i>=0; i--) cout<<((num >> i) & 1);
        cout<<endl;
        for(int i=0; i<16; i++) cout<<((num >> i) & 1);
        cout<<endl;
        return 0;
    }