На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Двоичное целое в двоичное дробное , Как перевести
    Всем доброе времени суток!
    Подскажите пожалуйста как используя двоичную арифметику (сложение, сдвиг и инверсия) двоичные целые числа перевести в двоичное дробное.
    Например число 5 в двоичном 101 перевести в 0,5 т.е. 0,1 или число (625) 1001110001 в (0,625) 0,101

    Я хочу указать дробное число в десятичном представлении (без "0,"), а программа на ассемблере должна перевести его в двоичный вид. Как это сделать?
      Элементарно же.

      0.625 - это 625/1000, последовательно делим в столбик и выводим цифры. В случае с двоичными числами еще проще:

      1: Сравниваем делимое и делитель. Если делимое меньше, выводим 0. Иначе выводим 1 и вычитаем делитель из делимого.
      2: Сдвигаем делимое на 1 бит влево.
      3: Если делимое не ноль и не достигнута нужная точность, то goto 1.
        bigory
        Читайте про перевод в системы счисления. И заодно про форматы чисел.

        Цитата bigory @
        двоичные целые числа перевести в двоичное дробное.Например число 5 в двоичном 101 перевести в 0,5 т.е. 0,1 или число (625) 1001110001 в (0,625) 0,101

        Это у тебя в примере не бинарные это смесь десятичного и бинарного.
        Тебе это точно нужно или что-то другое?

        Тут просто умножаешь на 2, в десятичной системе счисления. Смотришь старший разряд и выводишь его.
        Затем снова умножаешь на 2 и тд.
        Так как не все числа конечные в десятичной системе будут конечными в двоичное. Т.е. будут бесконечные числа, то просто цикл ограничь несколькими итерациями.

        Будут конкретные вопросы спрашивай.
          Цитата AVA12 @
          1: Сравниваем делимое и делитель. Если делимое меньше, выводим 0. Иначе выводим 1 и вычитаем делитель из делимого.
          2: Сдвигаем делимое на 1 бит влево.
          3: Если делимое не ноль и не достигнута нужная точность, то goto 1.


          Деление нельзя использовать. Нету такой операции на старом процессоре (Тесей)

          Цитата Pavia @
          Это у тебя в примере не бинарные это смесь десятичного и бинарного.


          То что я указал числа в десятеричном, это для того, чтобы показать что за двоичное число. Мне нужно переводить только двоичные числа. Используя сдвиги, сложения и инверсию

          Цитата Pavia @
          Тут просто умножаешь на 2, в десятичной системе счисления. Смотришь старший разряд и выводишь его.
          Затем снова умножаешь на 2 и тд.
          Так как не все числа конечные в десятичной системе будут конечными в двоичное. Т.е. будут бесконечные числа, то просто цикл ограничь несколькими итерациями.


          Идея понятна и очень интересна, но а как без десятеричных чисел?
            Изначально вы пишете:
            Цитата bigory @
            Я хочу указать дробное число в десятичном представлении (без "0,"), а программа на ассемблере должна перевести его в двоичный вид. Как это сделать?
            А потом так пишете:
            Цитата bigory @
            Идея понятна и очень интересна, но а как без десятеричных чисел?


            Вам же Pavia написал: есть у вас число 0,1415926. Вы умножаете на 2. Получаете 0,2831852. Пишем старший разряд: 0,0
            Снова на 2: 0,5663704. Снова старший: 0,00. Ещё раз на 2: 1,1327408. Теперь так вышло: 0,001. И т.д.
            Или как вы хотите?
              bigory
              Цитата bigory @
              Идея понятна и очень интересна, но а как без десятеричных чисел?

              С бинарнами вам AVA12 все описал. Читайте внимательно обычное деление в столбик.
                Цитата Славян @
                Вам же Pavia написал: есть у вас число 0,1415926. Вы умножаете на 2. Получаете 0,2831852. Пишем старший разряд: 0,0
                Снова на 2: 0,5663704. Снова старший: 0,00. Ещё раз на 2: 1,1327408. Теперь так вышло: 0,001. И т.д.


                Вы используете десятичное число 0,1415926, а я спрашиваю как это делать без десятичных чисел. Т.е. дано 1001110001, получить 0,101

                Цитата Pavia @
                обычное деление в столбик

                Используя только сложение, сдвиг и инверсию. Процессор старый (Тесей), там нет деления.
                  Цитата
                  Деление нельзя использовать.

                  Внимательно перечитай шаги 1 - 3 и ткни пальцем, где там говорится про операцию деления.
                  Сообщение отредактировано: AVA12 -
                    Ясно. Но всё же деление в столбик слишком универсально, чтобы его игнорировать!
                    Берёте число 10, кое в двоичной будет 1010b. Делите ваше 1001110001 на него так: Голова 1001b меньше нашего, потому будет 0.
                    Удлинённая голова 10011b больше нашего 1010b. Вычтем(записав 1)! : 10011b-1010b = 1001b. Снова в бой!
                    Опять не вышло, запишем 0. А потом снова получится! Имеем: 0,10..b и т.д.

                    Добавлено
                    П.С. AVA12, это я писал ответ на #7, если что. А то ведь можно подумать... ;-)
                      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-м посте.
                        Цитата 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
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0316 ]   [ 14 queries used ]   [ Generated: 3.06.24, 16:27 GMT ]