** kea |
Отправлено: 01.11.2005, 17:10 |
|
Не зарегистрирован
|
Здравствуйте!
Какой из кусков кода эффективней по количеству выполняемых операций:
if ( BitSum == true )
BitStr = "1" + BitStr;
else
BitStr = "0" + BitStr;
или
BitStr = AnsiString( (int)BitSum ) + BitStr; |
|
Георгий |
Отправлено: 01.11.2005, 21:44 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
одинаково тормознуто.
быстрее будет если подписывать в конец строки или использовать массив с заранее зарезервированный размером и подписывать в конец .
Отредактировано Георгий — 01/11/2005, 22:45 |
|
AVC |
Отправлено: 02.11.2005, 09:49 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
2** kea
В BitStr иметь впереди один лишний символ (пробел?) и писать что то типа
BitStr[1] = BitSum? '1' : '0'; или *(BitStr.c_str()) = BitSum? '1' : '0';
Но если стал вопрос об оптимальности лучше перейти к простым типам и массивам типа char. |
|
Asher |
Отправлено: 02.11.2005, 11:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Оптимальным будет формировать строку BitStr длиннее на один символ, который стоит вначале и имеет значение '0'.
Тогда в конце просто
if ( BitSum)
BitStr[1] = '1';
|
|
olegenty |
Отправлено: 02.11.2005, 11:48 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
странно, что вариант с классом никто не предлагает
|
|
** kea |
Отправлено: 02.11.2005, 17:16 |
|
Не зарегистрирован
|
Здравствуйте!
Второй вариант вероятно более эффективен, если работать с AnsiString.
Что за вариант с классами? |
|
Grigoriy |
Отправлено: 02.11.2005, 17:23 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE | или
BitStr = AnsiString( (int)BitSum ) + BitStr; |
Этот код правильно работает.
Но в этом случае процессор будет копировать область памяти, которую занимала старая строка на новое место и затратится определенное количество тактов.
Лучше сразу размер строки сделать на один байт больше и тогда :
CODE |
BitStr[1]=(unsigned char)BitSum+0x30;
|
Символ '0' кодируется в таблице кодов символов ANSI и ASCII
байтом со значением
00110000 (двоичная система)
0x30 (шестнадцатеричная система)
48 (десятичная).
|
|
kea |
Отправлено: 02.11.2005, 17:46 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
Здравствуйте! Размер строки увеличивается на один символ в цикле, например до 16 или 32. |
|
Asher |
Отправлено: 02.11.2005, 17:54 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
QUOTE | Здравствуйте! Размер строки увеличивается на один символ в цикле, например до 16 или 32. |
И тебе привет.
Начинай не с пустой строки, а с строки в которой уже лежит "0"
А в конце делай как я сказал.
А еще лучше сформируй строку нулей нужной длины и меняй в нужных позициях нули на единицы
P.S. Вспомнил поговорку времен ранней молодости:
"Слушай меня и голос америки."
|
|
Георгий |
Отправлено: 02.11.2005, 23:55 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
а может тут не строка нужна, а ?
Отредактировано Георгий — 03/11/2005, 00:55 |
|
AVC |
Отправлено: 03.11.2005, 09:36 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
? int16 / int32 и установки, проверки битов ? |
|