Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как БЫСТРО сконвертировать однобайтовое число в строковый побитовый эквивалент

6.3K
15 марта 2005 года
Slava_rec
16 / / 20.11.2004
Здорово, народ!!! Вот такая вот задача... Как БЫСТРО сконвертировать однобайтовое число (ASCII-код) в строковый эквивалент, записанный с помощью нулей и единиц...
Ну т.е. было 57 стало "111001" ("00111001")...
Мой вариант, где текст из RichEdit'а преобразуется в строку, стостоящую из нулей и единичек:


AnsiString InitialStream = InitialStreamRichEdit->Text;

int i = 1;
int ASCIICodeBitNumber, ASCIICodeBit;
AnsiString ASCIICodeString = "";

do
{
for (ASCIICodeBitNumber = 7; ASCIICodeBitNumber >= 0; ASCIICodeBitNumber--)
{
ASCIICodeBit = InitialStream;
ASCIICodeBit = ASCIICodeBit >> ASCIICodeBitNumber;
ASCIICodeBit = ASCIICodeBit & 1;

ASCIICodeString = ASCIICodeString + ASCIICodeBit;
}
i++;
}
while (i <= InitialStream.Length());
487
15 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Slava_rec
Здорово, народ!!! Вот такая вот задача... Как БЫСТРО сконвертировать однобайтовое число (ASCII-код) в строковый эквивалент, записанный с помощью нулей и единиц...
Ну т.е. было 57 стало "111001" ("00111001")...
Мой вариант, где текст из RichEdit'а преобразуется в строку, стостоящую из нулей и единичек:


AnsiString InitialStream = InitialStreamRichEdit->Text;

int i = 1;
int ASCIICodeBitNumber, ASCIICodeBit;
AnsiString ASCIICodeString = "";

do
{
for (ASCIICodeBitNumber = 7; ASCIICodeBitNumber >= 0; ASCIICodeBitNumber--)
{
ASCIICodeBit = InitialStream;
ASCIICodeBit = ASCIICodeBit >> ASCIICodeBitNumber;
ASCIICodeBit = ASCIICodeBit & 1;

ASCIICodeString = ASCIICodeString + ASCIICodeBit;
}
i++;
}
while (i <= InitialStream.Length());



Ну можно еще и так:

Код:
char *ptr;
AnsiString ASCIICodeString = "";
AnsiString InitialStream = InitialStreamRichEdit->Text;
ptr=InitialStream.c_str();
while(*ptr)
{
  for (int j=0;j<8;j++)
  {
     ASCIICodeString+=(char)(0x30+(*ptr&1));
     *ptr>>=1;
  }
  ptr++;
}
368
15 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by ddnh_bc
Ну можно еще и так:...

Первый код тотально не рабочий. Мин. 3 ошибки. Напр. ASCIICodeBit = ASCIICodeBit >> ASCIICodeBitNumber; после 4й итерации обнуляет любой ASCII код.

С твоим кодом все класс, за исключением того, что переводит в двоичный код в обратном порядке.

Код:
String kod[10] = { "00110000",
    "00110001", "00110010", "00110011",
    "00110100", "00110101", "00110110",
    "00110111", "00111000", "00111001",
  };
  char *ptr;
  AnsiString ASCIICodeString = "";
  AnsiString InitialStream = InitialStreamRichEdit->Text;
  ptr=InitialStream.c_str();
  while(*ptr)
  {
    char c = *ptr;
    if((c<='9')&&(c>='0'))
      ASCIICodeString+=kod[c-0x30];
    else
      ASCIICodeString+=" ERROR  ";
    ptr++;
  }
6.3K
15 марта 2005 года
Slava_rec
16 / / 20.11.2004
Мой код тотально рабочий!!! :D
Мне нужно сконвертировать однобайтовое число, т.е. ASCII-код ЛЮБОГО символа, в его в строковый эквивалент... Я же ясно это написал!!!
368
16 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Slava_rec
Мой код тотально рабочий!!! :D
Мне нужно сконвертировать однобайтовое число, т.е. ASCII-код ЛЮБОГО символа, в его в строковый эквивалент... Я же ясно это написал!!!


Да, ты прав. Я не заметил, что значение ASCIICodeBit каждый раз заново инициализируется в цикле.

Код:
AnsiString InitialStream=InitialStreamRichEdit->Text;  
  int i=1;
  byte ASCIICodeBit;
  AnsiString ASCIICodeString="";
  do
  {
    ASCIICodeBit=InitialStream;
    for(byte x=0x80;x>0;x=x>>1)
      ASCIICodeString+=(ASCIICodeBit&x)?'1':'0';
    i++;
  }
  while(i<=InitialStream.Length());
487
16 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Slava_rec
Мой код тотально рабочий!!! :D
Мне нужно сконвертировать однобайтовое число, т.е. ASCII-код ЛЮБОГО символа, в его в строковый эквивалент... Я же ясно это написал!!!



Ну я же привел тебе пример кода. Можешь использовать. Биты в результате идут в порядке L-R (слева направо - от младшего к старшему).

Если нужен обратный порядок, тогда так:

Код:
char *ptr;
AnsiString ASCIICodeString = "";
AnsiString InitialStream = InitialStreamRichEdit->Text;
ptr=InitialStream.c_str();
while(*ptr)
{
  for (int j=0;j<8;j++)
  {
     ASCIICodeString+=(char)(0x30+(((*ptr)&0x80))>>7);
     *ptr<<=1;
  }
  ptr++;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог