|  | 
	| 
			| 
					
						| 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++ » |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| 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 ); |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |