Системы счисления.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.12.2006 (Пн) 23:45

LOL. Что тут ещё сказать.

Надо зацитатить ещё...

Ну я понимаю, вы тут профи старой школы, кто на Суре сидел, кто на Спектруме...

ну не профи старой школы... не профи. чтот тут поделаешь. и на спектруме я никогда не сидел.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.12.2006 (Вт) 0:54

VB_D3D_Денис, Mid возвращает тип Variant...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 1:21

Amed писал(а):VB_D3D_Денис, Mid возвращает тип Variant...

Согласен и даже добавлю:
VB5 Help писал(а):Mid Function
Returns a Variant (String) containing a specified number of characters from a string.

Как я понимаю это Вариант, подтип String.
Кроме того,
Код: Выделить всё
Dim MyVar As String
MyVar = mid("abc", x, y)

Полностью аналогично
Код: Выделить всё
Dim MyVar ' или Dim MyVar as Variant
MyVar = mid$("abc", x, y)

только в первом (моем) случае переменная уже определена, как string и занимает положенное ей количество памяти. Во втором (lamer on line) случае переменная представляет из себя громадный тип вариант со всеми его подтипами и получает строковое значение в свой подтип строк... И третий случай глубокоуважаемого - Переменная уже стринг ей присваивают строку. Без разницы из типа или из подтипа.

О чем спорим? Ведь о прописных истинах спорим, причем об одном и том же... Обидно... :?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.12.2006 (Вт) 1:26

Не аналогично.
В твоем случае происходит лишнее и даже вредное преобразование типов (Variant на выходе функции -> String). Попробуй засунуть в цикл на несколько сотен тысяч итераций Mid и Mid$ и сравни время выполнения - оно будет очень и очень сильно отличаться (в разы).

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 1:33

Amed
Ты как всегда прав. При For i = 1 To 10000000 с $ 10 сек без него - 12-13 сек.
Я проиграл. Позвольте пожать Вашу руку.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.12.2006 (Вт) 1:36

Это не Amed как всегда прав. Это просто ты не прав. А Amed прав настолько же, насколько и я и все остальные люди, знающие о том что Variant - зло (в основном) и что операции с ним занимают значительно больше времени, чем при использовании конкретных типов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 1:43

Хакер
А в чем я неправ? :)

в том что признал поражение?
или в том, что извинился?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.12.2006 (Вт) 1:54

В том что думал что не нудно писать TDC. И что без него что то будет работать так же хорошо как и с ним.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 5:38

Хакер писал(а):Это не Amed как всегда прав. Это просто ты не прав. А Amed прав настолько же, насколько и я и все остальные люди, знающие о том что Variant - зло (в основном) и что операции с ним занимают значительно больше времени, чем при использовании конкретных типов.

Только не нужно превращать боязнь вариантов в религиозный культ, как в этом топике.

Если нужно вызывать преобразование в другую систему счисления зиллион раз подряд, то лучше его сделать совсем без строк. А можно, наверное, обойтись вообще без него: обычно это преобразование нужно при вводе-выводе данных, а не во внутреннем цикле вычислений.

Кроме того, если строки уже лежат в вариантах (например, вытащены из какого-нибудь Экселя, или MSXML, или FSO, или т.п.), то вызов Mid$ для них будет медленнее, чем Mid, потому что вот тут-то преобразование строки к варианту не нужно, а обратно нужно.

Я практически всегда пишу строковые функции без $ -- именно на том основании, что пути ускорения всегда лежат не в волшебном знаке доллара, а в уходе от строковых операций. Нечего создавать иллюзию, что код с Mid обязательно непрофессиональный, а код с Mid$ уже за счёт одного этого намного профессиональнее.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 5:55

Вот, решил проиллюстрировать свою идею примером.

Код: Выделить всё
Option Explicit

Function BinToDec(BinNumber As String) As Long
Dim i, j, S
   
    For i = Len(BinNumber) To 1 Step -1
        S = S + (Val(Mid(BinNumber, i, 1)) * (2 ^ j))
        j = j + 1
    Next
   
    BinToDec = S
End Function

Function BinToDec_Magic(BinNumber As String) As Long
Dim i As Long, j As Long, S As Long
   
    For i = Len(BinNumber) To 1 Step -1
        S = S + (Val(Mid$(BinNumber, i, 1)) * (2 ^ j))
        j = j + 1
    Next
   
    BinToDec_Magic = S
End Function

Function BinToDec_NoMagic(BinNumber As String) As Long
Dim i As Long
   
    For i = 1 To Len(BinNumber)
        BinToDec_NoMagic = BinToDec_NoMagic * 2 + Val(Mid(BinNumber, i, 1))
    Next
End Function

Sub Main()
Dim Start As Double, rpt As Long

Start = Timer
For rpt = 1 To 1000000
    BinToDec "101010101"
Next
Debug.Print Timer - Start, "BinToDec"
'14.17: исходный вариант

Start = Timer
For rpt = 1 To 1000000
    BinToDec_Magic "101010101"
Next
Debug.Print Timer - Start, "BinToDec_Magic"
'11.03: ускорение на 20% от магического знака доллара

Start = Timer
For rpt = 1 To 1000000
    BinToDec_NoMagic "101010101"
Next
Debug.Print Timer - Start, "BinToDec_NoMagic"
'7.08: ускорение на 100% без магического знака доллара

End Sub


Так что Хакер обращает внимание совсем не на те баги, из-за которых на самом деле всё тормозит.
Код нужно начинать "оптимизировать" только после того, как оптимизирован алгоритм, иначе это выброшенное впустую время.

Интересно, какой из вариантов здесь Хакер сочтёт более высокопрофессиональным -- с Mid или с Mid$? :-D
Изображение

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 12.12.2006 (Вт) 11:19

tyomitch :thumright:

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 11:22

Чего я так озадачился вопросом многосимвольных (если можно так выразиться) систем счисления? А дело в том, что чем больше основание, тем короче длина! Вот и упаковка данных. Получается, чем быстрее скорость преобразования в дес. и обратно - тем быстрее скорость обработки таких пакетов. Хотя, если научиться считать в "большой" системе счисления, то и раскодировать ее не надо.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 11:31

VB_D3D_Денис писал(а):А дело в том, что чем больше основание, тем короче длина! Вот и упаковка данных.

Топика "цитата года" у нас ещё нет? :lol: :lol:
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.12.2006 (Вт) 11:39

VB_D3D_Денис писал(а):А дело в том, что чем больше основание, тем короче длина! Вот и упаковка данных.
Додумай эту мысль до конца. Какое бы основание ты не придумал, храниться данные все равно будут в байтах. С основанием 256.

Зато можно придумать текстовую запись байтовых данных альтернативную хексу. Более емкую. Печатных символов заметно больше, чем 0-9 и A-F.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 12:03

А можно взять любую из уже существующих (base64, uue, etc.)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.12.2006 (Вт) 13:07

А что тут делает пост Кибирнетика? Дескать, какаой tyomitch маладэц, - вернул Хакера на место, да? :x
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.12.2006 (Вт) 13:09

Хакер, помоему твоя мнительность зашкаливает разумные пределы.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 12.12.2006 (Вт) 13:25

Да! Именно это я и имел ввиду. В кодах tyomitch всегда чувствуется рассудительный подход и самое главное сам код! Да и говорит он всегда по делу :wink:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.12.2006 (Вт) 13:27

Видешь, alibek, это не мнительность. Это предчувствие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.12.2006 (Вт) 13:28

alibek писал(а):Хакер, помоему твоя мнительность зашкаливает разумные пределы.
Он таки телепат... :)
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 14:38

Официально заявляю: Код, который я привел, а точнее функция ConvDecToAny работала НЕПРАВИЛЬНО!
Теперь на ее месте архивчик с готовым модулем и примером на Excel (Excel потому, что писалось на работе где нету VB)
В модуле три функции: Из десятичной в любую, из любой в десятичную и из любой в любую (NEW!!!) (Как предложил Хакер) :wink:
Последний раз редактировалось Денис 13.12.2006 (Ср) 12:59, всего редактировалось 2 раз(а).
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.12.2006 (Вт) 15:05

VB_D3D_Денис
Вообще то, идеальным вариантом была бы функция AnyToAny.

ЗЫ.
tyomitch :thumright:

А я помню, без восьми дней год назад, у Рамзеса такой же пост был.
http://bbs.vbstreets.ru/viewtopic.php?p=6574192#6574192
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 20:14

Телепат Хакер раскусил целый год маскировавшегося виртуала? :-)
Изображение

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 22:26

Хакер
AnyToAny конечно хорошо.
Но я алгоритма такого не знаю. я уже прогнал на ошибки DecToAny (которая конвертит методом "деления в столбик") и почти моментально наклепал AnyToDec (использует полином).
Таким образом если нам надо перевести ABCD16 в, скажем, 32-чную... то мы прогоняем сначала через AnyToDec(ABCD, 16) а затем DecToAny(43981, 32)
Вышеприведенный алгоритм можно смело назвать AnyToAny.
Кажется Win API так и работают. Сначала 10 подготовительных функций, пара-тройка пользовательских типов и перечислений, потом плавно переходим к нужной нам функции.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.12.2006 (Вт) 22:32

Полином Полиномыч! посмотри тот код, что я постил, а?
Изображение

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.12.2006 (Вт) 22:45

tyomitch
Да-да. Я смотрел. У тя тоже на полиномах. 8)
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 13.12.2006 (Ср) 2:08

Кстати, пару слов о ненавистном Variant - я писал похожие функции AnyToDec и DecToAny (ну по этой терминологии)... и задался идеей проверить, сколько же разрядов потянут мои функци... всмысле какое макс. число они обработают...
Выяснил, что DecToAny с аргументом Double выжал 15 разрядов в числе (десятичном...) (т.е. 999 999 999 999 999 - а дальше - Бейсик круглит и грешит), а с Variant\Decimal - 29 разрядов ! ну там CDec и результат конечно почти в 2 раза лучше!
Хочу сказать, что Variant - не зло. Притормаживает, но чуть-чуть... зато такие дела умеет делать. А зачем? - уже второй вопрос. ИМХО Я предпочитаю иметь одну функцию на Double-аргументе, а вторую на Variant'е.
Не выдержал и попостил )
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.12.2006 (Ср) 2:40

Вариант не зло. Но в тех применениях, в которых его применяют :D - зло.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 13.12.2006 (Ср) 13:01

VB_D3D_Денис писал(а):Официально заявляю: Код, который я привел, а точнее функция ConvDecToAny работала НЕПРАВИЛЬНО!
Теперь на ее месте архивчик с готовым модулем и примером на Excel (Excel потому, что писалось на работе где нету VB)
В модуле три функции: Из десятичной в любую, из любой в десятичную и из любой в любую (NEW!!!) (Как предложил Хакер) :wink:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Alex B. Fox
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.05.2006 (Пн) 14:23
Откуда: Москва

Re: Системы счисления.

Сообщение Alex B. Fox » 09.04.2017 (Вс) 20:57

Все реализации "Any2Any", что я встречал, - частные случаи.
Попытался ради интереса сделать универсальный алгоритм. Получился прототип конвертера, который отличается от большинства тем, что:
  • работает с положительными и отрицательными вещественными основаниями (Например, "8C.1355"(-16.9)=-123.2496(10)), в том числе, с основаниями по модулю менее 1;
  • более-менее работает со смешанными СС;
  • более-менее понимает унарные и нега-унарные системы;
  • может преобразовывать положительные и отрицательные вещественные числа;
  • позволяет смещать ноль в произвольную позицию (например, -12(10) в 6-ричной, с алфавитом "=-0123" и нулём в 3 позиции, соответствует "=0"(6)). В частном случае, когда ноль в середине алфавита, это даёт симметричную СС.
  • позволяет работать на произвольном алфавите;
  • спокойно относится к записи чисел с избыточностью (но сам такие числа не делает);
  • позволяет использовать в качестве цифр алфавита более 1 символа (позволяет использовать разные системы кодированя в смешанных системах);
  • до кучи добавлена римская СС - "R" и некоторые другие частные случаи.
Из минусов:
  • не поддерживает неоднородные системы (с переменным основанием);
  • имеет некоторую погрешность вычислений;
  • не быстрый;
  • не делал всех возможных проверок исходных данных, предполагая, что пользователь понимает, что пишет;
  • ...
Опыту нет - поправляйте, где не так.
Вложения
SSConverter.zip
конвертер
(29.19 Кб) Скачиваний: 202

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Mail.ru [бот] и гости: 12

    TopList  
cron