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
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;
}