Страница: 1 | 2 |
Вопрос: Перевод числа из двоичной системы счисления???
Добавлено: 18.10.04 13:26
Автор вопроса: K&M
Кто может подсказать, как перевести число из двоичной системы в десятичную?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Pashenko
ICQ: 176176951
Вопросов: 14
Ответов: 655
Профиль | | #1
Добавлено: 18.10.04 13:51
Dim L As Long
Dim i As Long
Dim N As Byte
L = Len(Value)
BinToDec = 0
For i = 1 To L
Select Case Mid$(Value, L - i + 1, 1)
Case "1"
BinToDec = BinToDec + 2 ^ (i - 1)
Case "0"
Case Else
BinToDec = -1
Exit Function
End Select
Next i
End Function
Номер ответа: 2
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #2
Добавлено: 18.10.04 14:00
Спа-а-асибо!
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 19.10.04 01:00
Очень просто. Зачем только это на VB.NET понадобилось???
Из любой в десятичную.
Что такое разряды знаешь? Ну там десятки, сотни, единицы...
Допустим число 123
10^2 10^1 10^0
1 2 3
10^0*3 + 10^1*2 + 10^2*1 = 123
Аналогично и для двоичной:
К примеру 10101100 (от фонаря)
128 64 32 16 8 4 2 1
--------------------------------------
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
1 0 1 0 1 1 0 0
(128*1)+(64*0)+(32*1)+(16*0)+(8*1)+(4*1)+(2*0)+(1*0)
Ответ: 172. Проверь по предыдущему алгоритму.
Номер ответа: 4
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #4
Добавлено: 20.10.04 13:26
А в обратную сторону проще:
Dim a As Int32 = 12345
Dim s As String = a.ToString("2"
Номер ответа: 5
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #5
Добавлено: 23.10.04 15:29
Благодарю за подсказку, просто я в системах счисления не очень то силён, до сих пор помню,как мне учитель информатики вдалбливал их... Вы спрашивали, зачем мне это нужно? Да архиватор в .NET задумал (уже сделал кстати, правда медленный ужасно...), там мне это и понадобилось.
Номер ответа: 6
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #6
Добавлено: 23.10.04 15:33
Кстати, до меня дошло - .NET и сам может всё перевести:
Dim ST as string = "10110"
Dim BT as Byte = System.Convert.ToByte(ST, 2)
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 24.10.04 00:59
Через строки - не лучший вариант. Их обработка требует дополнительного времени. Но если что то маленькое или не требовательное к скорости, то можно и через них.
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 24.10.04 04:52
А как он архивирует? Принцип какой? Мой тебе совет, хочешь скорости - забудь про строки, как элемент управления движком вообще. Используй их только для вывода сообщений.
Номер ответа: 9
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #9
Добавлено: 24.10.04 11:10
Принцип состоит в том, что если в файле много нулей, то он каждые два нуля складывает в один, правда если файл очень запутанный, то эффект будет прямо противоположный, потому-что если вдруг встречается комбинация 1-1 или 1-0, то получается так:
он складывает их оператором OR - получается 1. Раз получился 1 то ему ещё нужно знать: какой из битов равен 1 или оба сразу, он добавляет инфу о первом бите и если он равен 1, то ему приходится добавить и второй бит - этот момент файл и раздувает. надо сказать, что процесс, который занимает подавляющее кол - во времени и строки тут не причём.
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 26.10.04 06:07
Я не понял, ты что только нули архивируешь? А как с остальными числами? А если там вообще нулей нет?
и строки тут не причём.
А как же это?
Dim ST as string = "10110"
Dim BT as Byte = System.Convert.ToByte(ST, 2)
Вот здесь то они как раз причём.
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 26.10.04 06:14
Да, и алгоритм своего архиватора ты как то кусками описал. Причём принцип так и не объяснил.
Ну складываешь ты нули(!!!) с помощью OR, а дальше что? Ты наверное как то заменяешь нули цифрой, определяющей их количество? Как?
Опиши более внятно. Я не сомневаюсь что ты прекрасно знаешь свой алгоритм архивации. Будь добр, объясни и мне его.
Номер ответа: 12
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #12
Добавлено: 30.10.04 15:56
Ладно, значит так:
Имеется массив VALS() as Byte, в нём хранится файл.
Создаём массив PACKER() as boolean и в тут мы используем строки, чтобы перевести значения массива VALS() в массив PACKER(), то есть переводим байты в биты. Далее мы создаём массив NEWPack() as boolean и вот он сам процесс, в него мы записываем новые данные, полученные путём архивации PACKER():
Try
For i = 0 To UBound(PACKER) Step 2
k = k + 1
ReDim Preserve NewPack(k)
If Not to1 Then
NewPack(k - 1) = PACKER(i) Or PACKER(i + 1)
If NewPack(k - 1) Then
k = k + 1
ReDim Preserve NewPack(k)
NewPack(k - 1) = PACKER(i) And PACKER(i + 1)
If Not NewPack(k - 1) Then
k = k + 1
ReDim Preserve NewPack(k)
NewPack(k - 1) = PACKER(i)
End If
End If
Else
NewPack(k - 1) = PACKER(i) And PACKER(i + 1)
If Not NewPack(k - 1) Then
k = k + 1
ReDim Preserve NewPack(k)
NewPack(k - 1) = PACKER(i)
If Not PACKER(i) Then
k = k + 1
ReDim Preserve NewPack(k)
NewPack(k - 1) = PACKER(i + 1)
End If
End If
End If
Next
Catch X As System.IndexOutOfRangeException
NewPack(k - 1) = PACKER(i)
ReDim Preserve NewPack(k - 1)
End Try
ReDim Preserve NewPack(k - 1)
вот он, тут видно, что могут быть два случая: один, когда в файле больше нулей и когда больше единиц. В первом случае каждые два значения складываются OR-ом, во втором AND-ом. И в первом и во втором случае могут быть случаи, когда приходится дописывать дополнительные биты. Именно этот участок кода занимает большую часть времени, а строки используются ещё перед этим при переводе
из одной системы в другую и потом для перевода обратно. Но они работают достаточно быстро относительно этого участка.
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 31.10.04 06:48
ReDim Preserve NewPack(k)
Вот это точно замедляет. Определи размерность массива заранее.
А где код перевода байтов в биты? Я хочу глянуть как ты это делаешь.
Номер ответа: 14
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #14
Добавлено: 31.10.04 09:56
Вот это как раз то, о чём я спросил, но пока лучшего способа не знаю делаю через строки:
Dim ST as string
For i = 0 to UBound(Vals) step 8
ReDim Preserve PACKER(i + 7)
ST = System.Convert.ToString(VALS(i), 2)
 o While Len(ST)<8
ST = "0" & ST
Loop
For t = 1 to 8
PACKER(i + t - 1) = Mid(ST,t)
Next
Next
ReDim Preserve PACKER(i - 1)
... В скором времени переделаю, чтобы массив переопределялся заранее и тут и там. Как видишь приходится добавить 8 - Len(ST) нулей в начало, это обязательно.
Номер ответа: 15
Автор ответа:
K&M
Вопросов: 14
Ответов: 39
Профиль | | #15
Добавлено: 01.11.04 11:23
Большое спасибо за совет с размерностью: скорость выросла в десятки раз!