我有一个整数,想将其存储为二进制字符串表示。如何实现?
我有一个整数,想将其存储为二进制字符串表示。如何实现?
试试这个:
#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";
}
int
已经在内部以二进制形式表示了,但这只是一种实现细节——从概念上讲,它只是一个整数。int
并没有固有的十进制属性。x
的基数为 b
的表示,只需按照以下算法操作:
s
m = x % b
x = x / b
m
转换为数字,即 d
s
上附加 d
x
不为零,则转到步骤 2。s
b <= 10
并且计算机使用一种字符编码,其中数字 0-9 是连续的,则步骤 4 很容易,因为它只是 d = '0' + m
。否则,您需要一个查找表。s
的左侧附加 d
。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);
}
x
中的所有位向右移动一位”。对于无符号整数来说,它和x /= 2
有完全相同的语义。 - fredoverflowx
的值为0时,“条件”变为假;也就是说,当所有比特位都为0时。 - fredoverflow将数字与100000...、010000...、0010000...等进行 AND 操作。每次操作,如果结果为0,则在字符数组中放置一个“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);
http://www.phanderson.com/printer/bin_disp.html 是一个很好的例子。
一个简单方法的基本原理:
>>=
将 # 向右移动 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<<=1来计算上面的助记符位,从而将其用于任意大小的数字。
#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;
}
这里有一个小的仅包含头文件的库,你可以用它来实现这个功能 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"
没有直接的函数,您可以沿着 int 的位(提示参见 >>)行进,并在字符串中插入“1”或“0”。
听起来像是标准的面试/作业类型问题
sprintf
函数将格式化输出存储在字符串变量中,而不是直接使用 printf
进行打印。请注意,这些函数仅适用于 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
std::cout << bstring<signed int>(-1) << '\n';
这是我的电脑上的输出(如所述,每台计算机都有所不同),
11111111111111111111111111111111
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;
}