Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.148.102.184] |
|
Сообщ.
#1
,
|
|
|
Всем доброе времени суток!
Подскажите пожалуйста как используя двоичную арифметику (сложение, сдвиг и инверсия) двоичные целые числа перевести в двоичное дробное. Например число 5 в двоичном 101 перевести в 0,5 т.е. 0,1 или число (625) 1001110001 в (0,625) 0,101 Я хочу указать дробное число в десятичном представлении (без "0,"), а программа на ассемблере должна перевести его в двоичный вид. Как это сделать? |
Сообщ.
#2
,
|
|
|
Элементарно же.
0.625 - это 625/1000, последовательно делим в столбик и выводим цифры. В случае с двоичными числами еще проще: 1: Сравниваем делимое и делитель. Если делимое меньше, выводим 0. Иначе выводим 1 и вычитаем делитель из делимого. 2: Сдвигаем делимое на 1 бит влево. 3: Если делимое не ноль и не достигнута нужная точность, то goto 1. |
Сообщ.
#3
,
|
|
|
bigory
Читайте про перевод в системы счисления. И заодно про форматы чисел. Цитата bigory @ двоичные целые числа перевести в двоичное дробное.Например число 5 в двоичном 101 перевести в 0,5 т.е. 0,1 или число (625) 1001110001 в (0,625) 0,101 Это у тебя в примере не бинарные это смесь десятичного и бинарного. Тебе это точно нужно или что-то другое? Тут просто умножаешь на 2, в десятичной системе счисления. Смотришь старший разряд и выводишь его. Затем снова умножаешь на 2 и тд. Так как не все числа конечные в десятичной системе будут конечными в двоичное. Т.е. будут бесконечные числа, то просто цикл ограничь несколькими итерациями. Будут конкретные вопросы спрашивай. |
Сообщ.
#4
,
|
|
|
Цитата AVA12 @ 1: Сравниваем делимое и делитель. Если делимое меньше, выводим 0. Иначе выводим 1 и вычитаем делитель из делимого. 2: Сдвигаем делимое на 1 бит влево. 3: Если делимое не ноль и не достигнута нужная точность, то goto 1. Деление нельзя использовать. Нету такой операции на старом процессоре (Тесей) Цитата Pavia @ Это у тебя в примере не бинарные это смесь десятичного и бинарного. То что я указал числа в десятеричном, это для того, чтобы показать что за двоичное число. Мне нужно переводить только двоичные числа. Используя сдвиги, сложения и инверсию Цитата Pavia @ Тут просто умножаешь на 2, в десятичной системе счисления. Смотришь старший разряд и выводишь его. Затем снова умножаешь на 2 и тд. Так как не все числа конечные в десятичной системе будут конечными в двоичное. Т.е. будут бесконечные числа, то просто цикл ограничь несколькими итерациями. Идея понятна и очень интересна, но а как без десятеричных чисел? |
Сообщ.
#5
,
|
|
|
Изначально вы пишете:
Цитата bigory @ А потом так пишете:Я хочу указать дробное число в десятичном представлении (без "0,"), а программа на ассемблере должна перевести его в двоичный вид. Как это сделать? Цитата bigory @ Идея понятна и очень интересна, но а как без десятеричных чисел? Вам же Pavia написал: есть у вас число 0,1415926. Вы умножаете на 2. Получаете 0,2831852. Пишем старший разряд: 0,0 Снова на 2: 0,5663704. Снова старший: 0,00. Ещё раз на 2: 1,1327408. Теперь так вышло: 0,001. И т.д. Или как вы хотите? |
Сообщ.
#6
,
|
|
|
bigory
Цитата bigory @ Идея понятна и очень интересна, но а как без десятеричных чисел? С бинарнами вам AVA12 все описал. Читайте внимательно обычное деление в столбик. |
Сообщ.
#7
,
|
|
|
Цитата Славян @ Вам же Pavia написал: есть у вас число 0,1415926. Вы умножаете на 2. Получаете 0,2831852. Пишем старший разряд: 0,0 Снова на 2: 0,5663704. Снова старший: 0,00. Ещё раз на 2: 1,1327408. Теперь так вышло: 0,001. И т.д. Вы используете десятичное число 0,1415926, а я спрашиваю как это делать без десятичных чисел. Т.е. дано 1001110001, получить 0,101 Цитата Pavia @ обычное деление в столбик Используя только сложение, сдвиг и инверсию. Процессор старый (Тесей), там нет деления. |
Сообщ.
#8
,
|
|
|
Цитата Деление нельзя использовать. Внимательно перечитай шаги 1 - 3 и ткни пальцем, где там говорится про операцию деления. |
Сообщ.
#9
,
|
|
|
Ясно. Но всё же деление в столбик слишком универсально, чтобы его игнорировать!
Берёте число 10, кое в двоичной будет 1010b. Делите ваше 1001110001 на него так: Голова 1001b меньше нашего, потому будет 0. Удлинённая голова 10011b больше нашего 1010b. Вычтем(записав 1)! : 10011b-1010b = 1001b. Снова в бой! Опять не вышло, запишем 0. А потом снова получится! Имеем: 0,10..b и т.д. Добавлено П.С. AVA12, это я писал ответ на #7, если что. А то ведь можно подумать... ;-) |
Сообщ.
#10
,
|
|
|
bigory, 510 = 22 + 20 = 1012; 18610 = 27 + 25 + 24 + 23 + 21 = 101110102; 0,510 = 2-1 = 0,12; 0,62510 = 2-1 + 2-3 = 0,1012. Индукция ясна? Отсюда как раз и следует алгоритм, приведённый Pavia во 3-м посте.
|
Сообщ.
#11
,
|
|
|
Цитата bigory @ Я хочу указать дробное число в десятичном представлении (без "0,"), а программа на ассемблере должна перевести его в двоичный вид. Как это сделать? Цитата bigory @ Идея понятна и очень интересна, но а как без десятеричных чисел? Если у тебя исходное число задается в строковом десятичном виде, то задачу можно решить двумя способами - либо в двоичном виде способом #2 AVA12, но тогда нужно предварительно преобразовать само число (например "625"), и соответствующую ему степень десяти (1000) в двоичный вид (используя умножения на 10 или его замену сдвигами и сложениями, если нельзя использовать умножение). Либо можно решать задачу непосредственно в двоично-десятичном побайтовом виде способом #3 Pavia - для этого достаточно сначала просто вычесть из каждого символа (байта) строки значение '0' для получения цифр 0..9, а затем производить побайтные умножения на 2 (сдвигом на 1 вверх) с приведением полученного значения к диапазону 0..9 и учетом переноса в старший разряд - тогда наличие или отсутствие переноса из самого старшего разряда и будет давать значение двоичного разряда искомого числа. Например: (6,2,5)*2=(12, 4,10)=1(2,5,0) -> 0.1 (2,5,0)*2=( 4,10, 0)=0(5,0,0) -> 0.10 (5,0,0)*2=(10, 0, 0)=1(0,0,0) -> 0.101 |