Вывести битовое представление строки - PullRequest
0 голосов
/ 04 апреля 2009

Как напечатать битовое представление строки

std::string = "\x80";

void print (std::string &s) {

    //How to implement this
}

Ответы [ 7 ]

6 голосов
/ 04 апреля 2009

Я бы проголосовал за 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"); 
}
4 голосов
/ 04 апреля 2009

Порядковый или обратный порядок?

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 -тишской точки зрения ... если вы уже используете C ++ с STL, вы также можете пройти весь путь и воспользоваться функциональностью набора битов STL вместо игры со строками.

3 голосов
/ 04 апреля 2009

Самое простое решение следующее:

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.
  • Вы можете написать свой собственный манипулятор, если хотите более гибкое решение, чем существующее.

EDIT:
К сожалению. Кто-то уже выкладывал подобное решение.

3 голосов
/ 04 апреля 2009

в ответ на Stephan202:

#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");
}
3 голосов
/ 04 апреля 2009

Попробуйте:

#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);
}
1 голос
/ 04 апреля 2009

Извините, я отметил это как дубликат. Во всяком случае, для этого:

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);
    }
};
0 голосов
/ 04 апреля 2009

Если вы хотите сделать это вручную, вы всегда можете использовать справочную таблицу. 256 значений в статической таблице вряд ли много накладных расходов:

static char* bitValues[] = 
{
"00000000",
"00000001",
"00000010",
"00000011",
"00000100",
....
"11111111"
};

Тогда печать - это простое дело:

for (string::const_iterator i = s.begin(); i != s.end(); ++i)
{
    cout << bitValues[*i];
}
...