每 8 位将 bitset<64> 转换为字符串
convert bitset<64> to string every 8 bit
我想将 std::bitset<64>
转换为 std::string
。
这是我试过的:
std::string bitsetToChar(std::bitset<64> bitset){
std::bitset<8> bit;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
bit[j] = bitset[i*8+j];
}
// new char c using above bits
// link chars
}
}
结果应该是一个由 8 个字符组成的字符串。
编辑
这里有一个 16 位的例子:
bitset<16> bits = 0100000101000010;
// first 8 bit is 01000001, second is 01000010
输出应为 std::string
,内容为 AB
。
使用std::bitset::to_string,像这样:
#include <iostream> // std::cout
#include <string> // std::string
#include <bitset> // std::bitset
void bitsetToChar(std::bitset<64> mybits) {
std::bitset<8> bit;
for(int i = 0; i < 64; ++i)
{
bit[i % 8] = mybits[i];
if((i - 7) % 8 == 0)
{
std::string mystring = bit.to_string<char,std::string::traits_type,std::string::allocator_type>();
std::cout << "mystring: " << mystring << '\n';
}
}
}
int main ()
{
std::bitset<64> mybits;
mybits.set();
bitsetToChar(mybits);
return 0;
}
输出:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
我想这就是你想要做的。访问bitset时注意不要越界。
如果还不够,请看?
我不确定我是否理解您的问题。由于您的问题看起来像是家庭作业,这里是一个可能对您有帮助的示例,而不是实际的解决方案 (demo):
#include <iostream>
#include <bitset>
int main()
{
std::bitset<16> b { "0100000101000010" }; // "AB"
std::bitset<16> m { "0000000011111111" }; // 0xff
for ( int i = 0; i < 2; ++i )
{
std::cout << char( ( b & m ).to_ullong() ); // will display "BA"
b >>= 8;
}
return 0;
}
编辑 - 一天后
可能的解决方案(demo):
#include <iostream>
#include <string>
#include <bitset>
template < std::size_t N >
std::string to_text( std::bitset< N > b )
{
return b.any()
? to_text( b >>= 8 ) + char( b.to_ullong() & 0xff )
: "";
}
int main()
{
std::cout << to_text( std::bitset<16> { "0100000101000010" } );
return 0;
}
这是一个非常便携的解决方案:
template<size_t N>
std::string bitset_to_string(std::bitset<N> bits){
static_assert(N % CHAR_BIT == 0, L"bitset size must be multiple of char");
std::string toReturn;
for(size_t j = 0; j < N/CHAR_BIT; ++j)
{
char next = 0;
for(size_t i = 0; i < CHAR_BIT; ++i)
{
size_t index = N - (CHAR_BIT*j) - i - 1;
size_t pos = CHAR_BIT - i - 1;
if (bits[index])
next |= (1 << pos);
}
toReturn.push_back(next);
}
return toReturn;
}
Demo
它使用 climits.h 定义的 CHAR_BIT
来获取字节中的位数(并且 char
保证为 1 个字节)。
要点是我们从左到右一次处理 1 个字节的位集。
两项测试:
std::bitset<16> bits{"0100000101000010"}; // AB
std::bitset<8> bits2{"01000001"};
std::cout << bitset_to_string(bits) << std::endl;
std::cout << bitset_to_string(bits2) << std::endl;
输出:
AB
A
我想将 std::bitset<64>
转换为 std::string
。
这是我试过的:
std::string bitsetToChar(std::bitset<64> bitset){
std::bitset<8> bit;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
bit[j] = bitset[i*8+j];
}
// new char c using above bits
// link chars
}
}
结果应该是一个由 8 个字符组成的字符串。
编辑
这里有一个 16 位的例子:
bitset<16> bits = 0100000101000010;
// first 8 bit is 01000001, second is 01000010
输出应为 std::string
,内容为 AB
。
使用std::bitset::to_string,像这样:
#include <iostream> // std::cout
#include <string> // std::string
#include <bitset> // std::bitset
void bitsetToChar(std::bitset<64> mybits) {
std::bitset<8> bit;
for(int i = 0; i < 64; ++i)
{
bit[i % 8] = mybits[i];
if((i - 7) % 8 == 0)
{
std::string mystring = bit.to_string<char,std::string::traits_type,std::string::allocator_type>();
std::cout << "mystring: " << mystring << '\n';
}
}
}
int main ()
{
std::bitset<64> mybits;
mybits.set();
bitsetToChar(mybits);
return 0;
}
输出:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
mystring: 11111111
我想这就是你想要做的。访问bitset时注意不要越界。
如果还不够,请看
我不确定我是否理解您的问题。由于您的问题看起来像是家庭作业,这里是一个可能对您有帮助的示例,而不是实际的解决方案 (demo):
#include <iostream>
#include <bitset>
int main()
{
std::bitset<16> b { "0100000101000010" }; // "AB"
std::bitset<16> m { "0000000011111111" }; // 0xff
for ( int i = 0; i < 2; ++i )
{
std::cout << char( ( b & m ).to_ullong() ); // will display "BA"
b >>= 8;
}
return 0;
}
编辑 - 一天后
可能的解决方案(demo):
#include <iostream>
#include <string>
#include <bitset>
template < std::size_t N >
std::string to_text( std::bitset< N > b )
{
return b.any()
? to_text( b >>= 8 ) + char( b.to_ullong() & 0xff )
: "";
}
int main()
{
std::cout << to_text( std::bitset<16> { "0100000101000010" } );
return 0;
}
这是一个非常便携的解决方案:
template<size_t N>
std::string bitset_to_string(std::bitset<N> bits){
static_assert(N % CHAR_BIT == 0, L"bitset size must be multiple of char");
std::string toReturn;
for(size_t j = 0; j < N/CHAR_BIT; ++j)
{
char next = 0;
for(size_t i = 0; i < CHAR_BIT; ++i)
{
size_t index = N - (CHAR_BIT*j) - i - 1;
size_t pos = CHAR_BIT - i - 1;
if (bits[index])
next |= (1 << pos);
}
toReturn.push_back(next);
}
return toReturn;
}
Demo
它使用 climits.h 定义的 CHAR_BIT
来获取字节中的位数(并且 char
保证为 1 个字节)。
要点是我们从左到右一次处理 1 个字节的位集。
两项测试:
std::bitset<16> bits{"0100000101000010"}; // AB
std::bitset<8> bits2{"01000001"};
std::cout << bitset_to_string(bits) << std::endl;
std::cout << bitset_to_string(bits2) << std::endl;
输出:
AB
A