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