|
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__
Команда клуба
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';
|
|
|
Записан
|
|
|
|
|
Serega
Гость
|
|
« Ответ #5 : 20-11-2003 20:03 » |
|
а зачем тебе каждый раз его инициализировать ?
|
|
|
Записан
|
|
|
|
|
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++ »
|
Записан
|
|
|
|
|
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++ »
|
Записан
|
|
|
|
|
RXL
|
|
« Ответ #12 : 21-11-2003 22:07 » |
|
Из-за того что при вставке твоя строка меняет размер, переменная цикла указывает правильную позицию только при первой итерации. Делай цикл с обратным отсчетом: for(i=(n-1)%8;i>0;i-=8) { temp.Insert(i,' '); }
|
|
« Последнее редактирование: 21-11-2007 16:47 от Алексей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
|
|
« Ответ #16 : 22-11-2003 09:54 » |
|
Serega, неоптимально каждый раз считать размер строки. А если бы это был не CString, а char* ? Обратный отсчет и нет проблем. А еще быстрее - собирать строку покускам в буфере - множественных перемещений блоков не будет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Serega
Гость
|
|
« Ответ #17 : 22-11-2003 19:54 » |
|
Если передается просто char* придется самому память выделять, т.к. просто вставить нельзя, так что CString удобнее Конечно можно собирать по кускам, количество копирований столько же, только обьем поменьше
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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 » |
|
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 );
|
|
|
Записан
|
|
|
|
|