سؤال
كيفية طباعة تمثيل البت سلسلة
std::string = "\x80";
void print (std::string &s) {
//How to implement this
}
المحلول
أود أن أصوت ل bitset
:
void pbits(std::string const& s) {
for(std::size_t i=0; i<s.size(); i++)
std::cout << std::bitset<CHAR_BIT>(s[i]) << " ";
}
int main() {
pbits("\x80\x70");
}
نصائح أخرى
Little-Endian أو Big-Endian؟
for (int i = 0; i < s.length(); i++)
for (char c = 1; c; c <<= 1) // little bits first
std::cout << (s[i] & c ? "1" : "0");
for (int i = 0; i < s.length(); i++)
for (unsigned char c = 0x80; c; c >>= 1) // big bits first
std::cout << (s[i] & c ? "1" : "0");
منذ أن أسمع بعض المتزامات عن قابلية مرتفعة ذلك char
هو البايت 8 بت في تعليقات الإجابات الأخرى ...
for (int i = 0; i < s.length(); i++)
for (unsigned char c = ~((unsigned char)~0 >> 1); c; c >>= 1)
std::cout << (s[i] & c ? "1" : "0");
هذا هو مكتوب من جدا C
وجهة نظر -.
يحاول:
#include <iostream>
using namespace std;
void print(string &s) {
string::iterator it;
int b;
for (it = s.begin(); it != s.end(); it++) {
for (b = 128; b; b >>= 1) {
cout << (*it & b ? 1 : 0);
}
}
}
int main() {
string s = "\x80\x02";
print(s);
}
التوسع في إجابة ستيفان 202:
#include <algorithm>
#include <iostream>
#include <climits>
struct print_bits {
void operator()(char ch) {
for (unsigned b = 1 << (CHAR_BIT - 1); b != 0; b >>= 1) {
std::cout << (ch & b ? 1 : 0);
}
}
};
void print(const std::string &s) {
std::for_each(s.begin(), s.end(), print_bits());
}
int main() {
print("\x80\x02");
}
أسهل الحل هو التالي:
const std::string source("test");
std::copy(
source.begin(),
source.end(),
std::ostream_iterator<
std::bitset< sizeof( char ) * 8 > >( std::cout, ", " ) );
- تسمح بعض تطبيقات STL STD :: SetBase () مناور للقاعدة 2.
- يمكنك كتابة المناور الخاصة بك إذا كنت تريد الحل الأكثر مرونة من القائمة.
تعديل:
أووبس. شخص ما نشر بالفعل حل مماثل.
أنا آسف لأقوم بمثابة هذا مكررة. أي طريقة للقيام بذلك:
void printbits(std::string const& s) {
for_each(s.begin(), s.end(), print_byte());
}
struct print_byte {
void operator()(char b) {
unsigned char c = 0, byte = (unsigned char)b;
for (; byte; byte >>= 1, c <<= 1) c |= (byte & 1);
for (; c; c >>= 1) cout << (int)(c&1);
}
};
إذا كنت ترغب في القيام بذلك يدويا، فيمكنك دائما استخدام جدول بحث. 256 قيم في جدول ثابت بالكاد الكثير من النفقات العامة:
static char* bitValues[] =
{
"00000000",
"00000001",
"00000010",
"00000011",
"00000100",
....
"11111111"
};
ثم الطباعة هي مسألة بسيطة من:
for (string::const_iterator i = s.begin(); i != s.end(); ++i)
{
cout << bitValues[*i];
}
لا تنتمي إلى StackOverflow