我有一个int,我想存储为二进制字符串表示。怎么办呢?
答案 0 :(得分:38)
试试这个:
#include <bitset>
#include <iostream>
int main()
{
std::bitset<32> x(23456);
std::cout << x << "\n";
// If you don't want a variable just create a temporary.
std::cout << std::bitset<32>(23456) << "\n";
}
答案 1 :(得分:14)
我有一个int,我想先转换为二进制数。
究竟是什么意思?没有类型“二进制数”。好吧,int
已经在内部以二进制形式表示,除非你使用的是一台非常奇怪的计算机,但这是一个实现细节 - 从概念上讲,它只是一个整数。
每次在屏幕上打印数字时,都必须将其转换为字符串。事实上,大多数I / O系统都为此过程选择了十进制表示,以便人们有更轻松的时间。但是int
没有任何固有的小数点。
无论如何,要生成整数b
的基本x
表示,只需遵循此算法:
使用空字符串
s
m = x % b
x = x / b
将m
转换为数字d
。
在d
上附加s
。
如果x
不为零,请转到第2步。
反向s
如果b <= 10
并且您的计算机使用数字0-9连续的字符编码,则步骤4很简单,因为它只是d = '0' + m
。否则,您需要一个查找表。
如果您提前知道需要多少空间并从字符串的右端开始,则可以简化步骤5和7以在d
的左侧附加s
。
如果是b == 2
(例如二进制表示),则第2步可以简化为m = x & 1
,第3步可以简化为x = x >> 1
。
reverse
的解决方案:#include <string>
#include <algorithm>
std::string binary(unsigned x)
{
std::string s;
do
{
s.push_back('0' + (x & 1));
} while (x >>= 1);
std::reverse(s.begin(), s.end());
return s;
}
reverse
的解决方案:#include <string>
std::string binary(unsigned x)
{
// Warning: this breaks for numbers with more than 64 bits
char buffer[64];
char* p = buffer + 64;
do
{
*--p = '0' + (x & 1);
} while (x >>= 1);
return std::string(p, buffer + 64);
}
答案 2 :(得分:2)
http://snippets.dzone.com/posts/show/4716或http://www.phanderson.com/printer/bin_disp.html是两个很好的例子。
简单方法的基本原则:
&
(按位和)#with 1.将结果(1或0)打印到字符串缓冲区的末尾。>>=
将#转换为1位。为避免反转字符串或需要将自己限制为符合缓冲区字符串长度的#s,您可以:
&
(按位和)带#的掩码。打印结果(1或0)。答案 3 :(得分:1)
我认为这与您关于可扩展散列的其他问题有关。
首先为您的位定义一些助记符:
const int FIRST_BIT = 0x1;
const int SECOND_BIT = 0x2;
const int THIRD_BIT = 0x4;
然后你要将你的号码换成一个字符串:
int x = someValue;
您可以使用逻辑&
运算符检查是否设置了位。
if(x & FIRST_BIT)
{
// The first bit is set.
}
如果设置了一个位,你可以保留一个std :: string并在该字符串中加1,如果未设置该位,则加0。根据你想要的顺序,你可以从最后一位开始,然后移到第一位或者只是从第一位开始。
你可以将它重构成一个循环,并通过在每次迭代后使用current_bit_value&lt;&lt; = 1来计算上面的助记符位,将其用于任意大小的数字。
答案 4 :(得分:1)
AND数字为100000 ...,然后是010000 ...,0010000 ......等。每次,如果结果为0,在char数组中放一个'0',否则放一个'1'
int numberOfBits = sizeof(int) * 8;
char binary[numberOfBits + 1];
int decimal = 29;
for(int i = 0; i < numberOfBits; ++i) {
if ((decimal & (0x80000000 >> i)) == 0) {
binary[i] = '0';
} else {
binary[i] = '1';
}
}
binary[numberOfBits] = '\0';
string binaryString(binary);
答案 5 :(得分:0)
没有直接的功能,你可以沿着int的位(提示参见&gt;&gt;)并在字符串中插入'1'或'0'。 听起来像标准的面试/家庭作业类型问题
答案 6 :(得分:0)
使用sprintf
函数将格式化的输出存储在字符串变量中,而不是printf
用于直接打印。但请注意,这些函数仅适用于C字符串,而不适用于C ++字符串。
答案 7 :(得分:0)
您可以使用一个只有小标题的库here。
示例:
std::cout << ConvertInteger<Uint32>::ToBinaryString(21);
// Displays "10101"
auto x = ConvertInteger<Int8>::ToBinaryString(21, true);
std::cout << x << "\n"; // displays "00010101"
auto x = ConvertInteger<Uint8>::ToBinaryString(21, true, "0b");
std::cout << x << "\n"; // displays "0b00010101"
答案 8 :(得分:0)
无反向,无附加副本且填充为0的解决方案:
#include <iostream>
#include <string>
template <short WIDTH>
std::string binary( unsigned x )
{
std::string buffer( WIDTH, '0' );
char *p = &buffer[ WIDTH ];
do {
--p;
if (x & 1) *p = '1';
}
while (x >>= 1);
return buffer;
}
int main()
{
std::cout << "'" << binary<32>(0xf0f0f0f0) << "'" << std::endl;
return 0;
}
答案 9 :(得分:0)
这是我的最好的整数(任何类型)转换成的std :: string的实现。如果仅将模板用于单个整数类型,则可以删除模板。据我所知,我认为C ++的安全性与C的隐秘性之间取得了很好的平衡。请确保包括所需的标头。
template<typename T>
std::string bstring(T n){
std::string s;
for(int m = sizeof(n) * 8;m--;){
s.push_back('0'+((n >> m) & 1));
}
return s;
}
像这样使用它
std::cout << bstring<size_t>(371) << '\n';
这是在我的电脑的输出(它不同于在每台计算机上),
0000000000000000000000000000000000000000000000000000000101110011
请注意,整个二进制串被拷贝并且因此填充的零,这有助于表示比特大小。因此字符串的长度的大小的为size_t 强>中位。
让我们尝试使用有符号整数(负数)
std::cout << bstring<signed int>(-1) << '\n';
这是我计算机上的输出(如上所述,每台计算机上都不同),
11111111111111111111111111111111
请注意,现在字符串更小了,这证明 signed int 所消耗的空间少于 size_t 。如您所见,我的计算机使用 2的补码方法表示带符号整数(负数)。现在,您可以了解为什么unsigned short(-1) > signed int(1)
下面是一个版本只是对于符号整数取得了令这个功能没有模板,即使用这个,如果你只打算转换的符号整数以字符串。
std::string bstring(int n){
std::string s;
for(int m = sizeof(n) * 8;m--;){
s.push_back('0'+((n >> m) & 1));
}
return s;
}