Страница: 1 | 2 |
Вопрос: Двоичная арифметика.
Добавлено: 12.01.06 05:26
Автор вопроса: CyRax | Web-сайт:
Написал вот модуль двоичной арифметики. Жду коментариев.
Описание.
Базовые операции для 64-битных беззнаковых целых чисел. Способ представления чисел идентичен стандарту Intel (перевёрнутые байты). Реализованы сложение, вычитание, умножение, деление, сдвиги, преобразование строки в число и наоборот. Рекомендуется для изучения двоичной арифметики.
PS: Ах да, совсем забыл :). Язык - VB6.
Ответы
Всего ответов: 26
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 12.01.06 05:28
http://basicproduction.nm.ru/BPALU.rar
Номер ответа: 2
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #2
Добавлено: 12.01.06 10:56
Скачаем и посмотрим
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 13.01.06 05:09
Ещё будет вторая версия с вещественными числами. Правда до умножения и деления наверное я не дойду. Может вообще ограничусь конвертированием строки в число и обратным.
Номер ответа: 4
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #4
Добавлено: 13.01.06 11:02
Гуд гуд!
Думаю очень гуд
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 16.01.06 10:48
Не качал, но наверняка отстой )
Щютка ))
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 17.01.06 14:48
Не совсем удачная шутка, ну да ладно. Кто то смотрел ещё? А то числа с плавающей запятой уже на подходе. Я думаю они вызовут больший интерес, поэтому даже написал статью об их устройстве.
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 17.01.06 19:15
Вычисления кстати можно ускорить если переделать алгоритм сдвигов так, чтобы считал процессор, т.к. и умножение и деление их интесивно использует. Но это если кому то нужно будет для реальных расчётов.
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 17.01.06 20:56
Я смотрел, не более... чё-то там считает ...
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 17.01.06 21:10
Та это демка. В цикле INC и DEC крутятся, ну чтобы не скучно было. А ценные там сложение, вычитание, умножение и деление. Ну и программные VAL, STR, BIN и HEX. Ими все часто пользуются и скорее всего рано или поздно возникнет желание глянуть как они работают. Ну вот собственно на VB, не на ассемблере заметьте, а на VB
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 17.01.06 21:17
Если кто то всё же переборет сильнейшие приступы сонливости и почитает подробнейшие коментарии к коду и найдёт их непонятными - дайте знать, а то знаете ли снимки с памяти одних людей могут совершенно ничего не значить для других. Хотя я всё же старался оставлять инструкции, а не кадры моей памяти, как любят иногда делать коментаро-статье писатели
Номер ответа: 11
Автор ответа:
SerJ
Вопросов: 24
Ответов: 332
Профиль | | #11
Добавлено: 18.01.06 00:19
И я качал, смотрел, правда, не очень понял (пока нету времени разбираться, а скачал ради интереса), но, может троха не в тему, скажи, как написать ф-ции типа Dec2Bin и обратно.
2 UL.eXe: ответы типа "Написать просто - ручками" не предлагать.
Знаю, что это задачка для первого класса ВБ программинга, но давно этим не пользовался - забыл.
Номер ответа: 12
Автор ответа:
[root]
Вопросов: 45
Ответов: 1212
Web-сайт:
Профиль | | #12
Добавлено: 18.01.06 01:19
Преобразование между десятичными, шестнадцатеричными и двоичными числами
Dim lDec As Long, aHex As String, aBin As String
lDec = 121
aHex = Hex$(lDec) ' Десятичное в шестнадцатеричное
lDec = Val("&H" & aHex) ' Шестнадцатеричное в десятичное
Обратите внимание, что не составляет труда преобразовать шестнадцатеричное значение в двоичное, поэтому, чтобы преобразовать из десятичного в шестнадцатеричное, удобней сперва преобразовать десятичное в двоичное. Наиболее быстрый способ двоичного преобразования, это использовать специальную таблицу преобразования.
Dim vBinTable As Variant
vBinTable = Array("0000", "0001", "0010", "0011", _
"0100", "0101", "0110", "0111", _
"1000", "1001", "1010", "1011", _
"1100", "1101", "1110", "1111"
Dim i As Integer, k As Long
For k = 1 To Len(aHex)
' Шестнадцатеричное в двоичное
i = Val("&H" & Mid$(aHex, k, 1))
aBin = aBin & vBinTable(i)
Next
Так же несложно сделать преобразование из двоичного значения в десятичное. Однако, это не всегда выполнимо, так как шестнадцатеричные и двоичные значения в VB могут представлять из себя намного большие размеры чем десятичное значение. Таким образом для преобразование из двоичного в шестнадцатеричное опять прибегнем к таблице преобразования, только другого типа.
Dim aBinTable As String, aHexTable As String
aBinTable = " 0000 0001 0010 0011 0100 0101 0110 0111" & _
" 1000 1001 1010 1011 1100 1101 1110 1111 "
aHexTable = "0123456789ABCDEF"
If Len(aBin) Mod 4 Then
' Делаем длину чётной 4
aBin = String$(Len(aBin) Mod 4, "0" & aBin
End If
aHex = ""
For k = 1 To Len(aBin) Step 4
i = InStr(aBinTable, " " & Mid$(aBin, k, 4))
aHex = aHex & Mid$(aHexTable, (i - 1) \ 5 + 1, 1)
Next
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 18.01.06 04:44
Десятичную в двоичную - это деление с остатком. Например 10
10/2=5 и 0 остаток
5/2=2 и 1 остаток
2/2=1 и 0 остаток
1/2=0 и 1 остаток
Ответ: 1010.
Обратно каждый разряд по степеням двойки. Что такое разряд надеюсь знаешь? Ну там единицы, десятки, сотни, тысячи и т.д. Ну вот, всё это степени 10. Например, 1,10,100,1000. Для двоичной тоже самое: 1,10,100,1000, только в переводе в десятичную это будет: 1,2,4,8.
1010 = (1*8)+(0*4)+(1*2)+(0*1)=8+2=10
или 32
32/2=16 и 0 остаток
16/2=8 и 0 остаток
8/2=4 и 0 остаток
4/2=2 и 0 остаток
2/2=1 и 0 остаток
1/2=0 и 1 остаток
Проверка: 100000
(1*32)+(0*16)+(0*8)+(0*4)+(0*2)+(0*1)=32
Вобщем тебе нужно запомнить разряды двоичной системы и считать будет гораздо легче. Например 15-й разряд - это 2^15, 31 разряд - 2^31 и т.д.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 18.01.06 05:12
Тоже самое и для 16-ричной.
71199/16=4449 и F остаток
4449/16=278 и 1 остаток
278/16=17 и 6 остаток
17/16=1 и 1 остаток
1/16=0 и 1 остаток
71199=1161F
Вобщем ты понял что при делении на какое либо число, остаток не может превышать этого числа.
Остаток - это не нечто абстрактное, а один из способов показать какая часть числа не соответствует полному разряду. Например, 23 - два полных разряда второй степени и остаток 3 более низкого разряда первой степени.
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 19.01.06 04:48
Как и обещал, добавил процедуры конвертации дробного числа в строку и обратно.
Вместе с вводной статьёй можно найти по адресу
http://basicproduction.nm.ru/articles/bpdblvb.htm
Пожалуйста, ваши коментарии.