Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Представление строки в двоичном виде  (Прочитано 31093 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 20-11-2003 18:56 » 

Собственно, есть строка типа char или объект CString. Вопрос: как мне представить эту строку в двоичном виде, то есть чтобы место букв выводились нули и единицы?   :?
Записан
Serega
Гость
« Ответ #1 : 20-11-2003 19:18 » 

Код:
CString ToBinary(char c)
{
static char mask[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
CString result;
int i = 8;
while( i-- )
{
result += (c & mask[i]) ? '1' : '0';
}
return result;
}

CString ToBinary(CString src)
{
CString result;
for(int i = 0; i < src.GetLength(); i++)
{
result += ToBinary(src[i]);
}
return result;
}
« Последнее редактирование: 21-11-2007 16:39 от Алексей1153++ » Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 20-11-2003 19:30 » 

Вы спасли меня. Огромное спасибо....    Ага
Только можете объяснить следующую строчку:
Код:
result += (c & mask[i]) ? '1' : '0'; 
« Последнее редактирование: 21-11-2007 16:40 от Алексей1153++ » Записан
Serega
Гость
« Ответ #3 : 20-11-2003 19:37 » 

условие ? если истинно : если ложно;
если в байте установлен маскируемый бит то к строке добавится '1' иначе '0';
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 20-11-2003 19:46 » 

static char mask[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
 а почему объявлено статически?
Записан
Serega
Гость
« Ответ #5 : 20-11-2003 20:03 » 

а зачем тебе каждый раз его инициализировать ?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #6 : 20-11-2003 21:35 » 

Если не сложно, можешь сказать а как обратно перевести из 2 ичной записи в символьную строку (CString). Программа должно ковертировать и туда и обратно.  :?
Записан
Anonymous
Гость
« Ответ #7 : 21-11-2003 06:17 » 

Код:
	char digits[8]; 

digits[0] = '0';
digits[1] = '1';
digits[2] = '0';
digits[3] = '1';
digits[4] = '0';
digits[5] = '1';
digits[6] = '0';
digits[7] = '1';

char mask[8] = {1, 2, 4, 8, 16, 32, 64, 128};
char ch = 0;

for(int i=0; i<8; i++)
{
ch += (digits[7-i]-48) * mask[i];
}

в ch искомое значение
« Последнее редактирование: 21-11-2007 16:41 от Алексей1153++ » Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #8 : 21-11-2003 06:37 » 

а как быть если стока - это объект CString, а строка состоит из неизвестного количества символов (единици нулей).
Записан
Anonymous
Гость
« Ответ #9 : 21-11-2003 06:48 » 

ну на 8 то должно делится... если нет, тогда нулями дополнить придется.
отрезаешь по 8 символов и конвертишь.
Записан
Serega
Гость
« Ответ #10 : 21-11-2003 07:02 » 

Код:
CString BinaryToCString(CString src)
{
if( src.GetLength() > 8 )
return BinaryToCString(src.Left(8)) +
                           BinaryToCString(src.Right(src.GetLength()-8));

if( src.GetLength() < 8 ) return _T("");

static char values[] = { 128, 64, 32, 16, 8, 4, 2, 1 };

char result = 0;
for(int i = 0; i < 8; i++)
{
result += (src[i] == '1') ? values[i] : 0;
}
return CString(result);
}
« Последнее редактирование: 21-11-2007 16:42 от Алексей1153++ » Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #11 : 21-11-2003 21:36 » 

Эта функция должна расставлять пробелы между символами в строке, то есть после каждого 8 символа. Но она не работает, подскажите что надо подправить?  

 
Код:
CString GetViewData(CString str)
{
int i=0,n=0,Line=1,t;
CString temp;
temp = str;
n = temp.GetLength();
for(i=0;i<n;i++)
{
 if((Line*8)==i)
 {
        temp.Insert(i,' ');
  Line++;
 }
}
return temp;
}
« Последнее редактирование: 21-11-2007 16:43 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 21-11-2003 22:07 » 

Из-за того что при вставке твоя строка меняет размер, переменная цикла указывает правильную позицию только при первой итерации. Делай цикл с обратным отсчетом:
Код:
for(i=(n-1)%8;i>0;i-=8) {
  temp.Insert(i,' ');
  }
« Последнее редактирование: 21-11-2007 16:47 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #13 : 21-11-2003 22:51 » 

Код:
CString GetViewData(CString str)
{
CString res,temp;
temp.Empty();
res.Empty();
temp = str;
int i=0;
int n = temp.GetLength();
for(i=0;i<n;i++)
{
if(!(i%8)&&i)
res+=" };
res += temp[i];
}
return res;
}
Я все исправил. Спасибо за помощь.
« Последнее редактирование: 21-11-2007 16:49 от Алексей1153++ » Записан
Serega
Гость
« Ответ #14 : 22-11-2003 08:38 » 

Что бы пробелами разделялись октеты немного измени код
Код:
CString ToBinary(CString src) 
{
   CString result;
   for(int i = 0; i < src.GetLength(); i++)
   {
      result += ToBinary(src[i]) + _T(" ");
   }
   return result;
}
« Последнее редактирование: 21-11-2007 16:50 от Алексей1153++ » Записан
Serega
Гость
« Ответ #15 : 22-11-2003 08:46 » 

А чтобы вставить пробелы в уже существующую строку
Код:
CString InsertSpaces(CString src)
{
CString result = src;
for(int i = 8; i < result.GetLength(); i += 8)
{
result.Insert( i++, _T("") );
}
return result;
}
« Последнее редактирование: 21-11-2007 16:51 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 22-11-2003 09:54 » 

Serega, неоптимально каждый раз считать размер строки. А если бы это был не CString, а char* ? Обратный отсчет и нет проблем.  А еще быстрее - собирать строку покускам в буфере - множественных перемещений блоков не будет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serega
Гость
« Ответ #17 : 22-11-2003 19:54 » 

Если передается просто char* придется самому память выделять, т.к. просто вставить нельзя, так что CString удобнее
Конечно можно собирать по кускам, количество копирований столько же, только обьем поменьше
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 23-11-2003 00:23 » 

Serega, я говориил о перемещениях, а не о копировании - при вставке идет перемещение. Вставка в позицию 8 - перемещение 8...end, вставка в позицию 17 - перемещение 17..end. Двигаются одни и те же данные. Кстати расширение блока при всавке идет, а, как следствие, наверняка и еще одно перемещение, но уже всей строки. А расчитать размер результирующего блока тут не сложно. Ну и память выделить еще проще. Всего один раз...

Вот до чего доводит увлечение плюсами Отлично Меньше плюсов - четче алгоритм, да и быстродействие не страдает...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serega
Гость
« Ответ #19 : 23-11-2003 07:36 » 

Перемещение и копирование это одно и тоже
Выделить память действительно не сложно, но вот следить за ней нет никакого желания Ага
Я не претендую на самый быстрый алгоритм, для меня намного важнее наглядность и простота кода, что бы взглянув на него через полгода я не стал задумываться что же происходит, а просто читал программу как книгу
Записан
Anonymous
Гость
« Ответ #20 : 23-11-2003 17:11 » 

Это я - Джон. Проблема со связью была - сообщения не отправлялись. Ну вроде работает. Только стартовая у меня не загружается. Ну ладно.

Парни, я вот о чём хотел сказать.

1. static char mask[] = { 1, 2, 4, 8, 16, 32, 64, 128 };  Это чего? А если надо надо 32 битное число? До 2х миллиардов расписывать?

не проще ли 1<<i где i степень двойки?

CString ToBinary(char c)
{
   CString result;
   int i = 8;
   while( i-- )
   {
      result += (c & (1<<i)) ? '1':'0';
   }
   return result;
}

2. Обратный перевод

Разбитие "по восемь" и формат с пробелами - это одно. Я про функции перевода:

опять же можно использовать сдвиг влево:

char BinToChar(CString stBin)
{
   char ch=0;
   int len = stBin.GetLength()-1;
   for (int i=len; i>=0; i--)
   {
      if(stBin.GetAt(i)=='1') ch+=1<<(len-i);
   }
   return ch;
}

Но более красивым мне кажется превод по аналогии 10ой системы:

char BinToChar2(CString stBin)
{
   char ch = 0;
   for(int i=0; i<stBin.GetLength(); i++)
   {
      ch *= 2;
      ch += stBin.GetAt(i)-'0';
   }
   return ch;
}

Разве это не проще и нагляднее?

Джон
Записан
Igor10
Гость
« Ответ #21 : 15-01-2004 15:33 » new

Цитата

Serega, я говориил о перемещениях, а не о копировании - при вставке идет перемещение.


Цитата

Перемещение и копирование это одно и тоже


CString voobche tiajolaia shtuka, a pri Insert idiot polnii delet i new.

no vot chto ubivaet:
Цитата

   CString res,temp;
   temp.Empty();
   res.Empty();
   temp = str;


ekonomte:
CString temp( str );
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines