我创建了一个将数字转换为二进制的函数。由于某种原因,它不起作用。它给出了错误的输出。输出是二进制格式,但它总是给出以零结尾的二进制数的错误结果(至少这是我注意到的......)
unsigned long long to_binary(unsigned long long x)
{
int rem;
unsigned long long converted = 0;
while (x > 1)
{
rem = x % 2;
x /= 2;
converted += rem;
converted *= 10;
}
converted += x;
return converted;
}
请帮我解决,这真是令人沮丧......
谢谢!
答案 0 :(得分:3)
使用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";
}
答案 1 :(得分:2)
考虑例如4.
第一次循环迭代后:
rem == 0
converted == 0
x == 2
第二次循环迭代后:
rem == 0
converted == 0
x == 1
然后你将转换为1。
尝试:
int i = sizeof(x) * 8; // i is now number of bits in x
while (i>0) {
--i;
converted *= 10;
converted |= (x >> i) & 1;
// Shift x right to get bit number i in the rightmost position,
// then and with 1 to remove any bits left of bit number i,
// and finally or it into the rightmost position in converted
}
使用x作为无符号字符(8位)运行上面的代码,值为129(二进制10000001)
从i = 8
开始,无符号字符的大小* 8.在第一个循环中,迭代i
将为7.然后我们取x
(129)并将其右移7位,得到值1.这是OR converted
变为1.下一次迭代,我们首先将converted
乘以10(现在它是10),然后我们转移x
6位右(值变为2),AND与1(值变为0)。我们OR 0和converted
,然后是10.第3到第7次迭代做同样的事情,converted
乘以10,从x
提取一个特定位并进行OR'ed进入converted
。在这些迭代之后,converted
是1000000。
在最后一次迭代中,第一个converted
乘以10并变为10000000,我们将x
右移0位,产生原始值129.我们将AND与x,这给出值1然后将1与OR进行converted
,变为10000001。
答案 2 :(得分:1)
你做错了;)
http://www.bellaonline.com/articles/art31011.asp
第一个分区的剩余部分是二进制形式中最右边的位,你的函数变成了最左边的位。
您可以这样做:
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的行。
答案 3 :(得分:0)
你实际上正在翻转二进制数! to_binary(2)将返回01,而不是10.当截断初始0时,它看起来与1相同。
如何这样做:
unsigned long long digit = 1;
while (x>0) {
if (x%2)
converted+=digit;
x/=2;
digit*=10;
}
答案 4 :(得分:0)
std :: bitset怎么样?
答案 5 :(得分:0)
如果要将数字显示为二进制,则需要将其格式化为字符串。我所知道的最简单的方法是使用STL bitset。
#include <bitset>
#include <iostream>
#include <sstream>
typedef std::bitset<64> bitset64;
std::string to_binary(const unsigned long long int& n)
{
const static int mask = 0xffffffff;
int upper = (n >> 32) & mask;
int lower = n & mask;
bitset64 upper_bs(upper);
bitset64 lower_bs(lower);
bitset64 result = (upper_bs << 32) | lower_bs;
std::stringstream ss;
ss << result;
return ss.str();
};
int main()
{
for(int i = 0; i < 10; ++i)
{
std::cout << i << ": " << to_binary(i) << "\n";
};
return 1;
};
该程序的输出是:
0: 0000000000000000000000000000000000000000000000000000000000000000
1: 0000000000000000000000000000000000000000000000000000000000000001
2: 0000000000000000000000000000000000000000000000000000000000000010
3: 0000000000000000000000000000000000000000000000000000000000000011
4: 0000000000000000000000000000000000000000000000000000000000000100
5: 0000000000000000000000000000000000000000000000000000000000000101
6: 0000000000000000000000000000000000000000000000000000000000000110
7: 0000000000000000000000000000000000000000000000000000000000000111
8: 0000000000000000000000000000000000000000000000000000000000001000
9: 0000000000000000000000000000000000000000000000000000000000001001
答案 6 :(得分:0)
如果您的目的只是将其显示为二进制表示,那么您可以尝试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;
}
答案 7 :(得分:0)
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;
}
}
答案 8 :(得分:0)
这是一个简单的解决方案。
#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;
}