Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Перевод числа из двоичной системы счисления??? Добавлено: 18.10.04 13:26  

Автор вопроса:  K&M
Кто может подсказать, как перевести число из двоичной системы в десятичную?

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #1 Добавлено: 18.10.04 13:51
Private Function BinToDec(Value As String) As Long
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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 24.10.04 00:59
Через строки - не лучший вариант. Их обработка требует дополнительного времени. Но если что то маленькое или не требовательное к скорости, то можно и через них.

Ответить

Номер ответа: 8
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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)

    ;Do 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
Большое спасибо за совет с размерностью: скорость выросла в десятки раз!

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам