Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399

Деление двоичных чисел школьным методом

20.10.2013, 19:18. Показов 3879. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,

делить столбиком двоичные числа я умею, собственно делить нужно вещественное двоичное на вещественное двоичное (от вещественных перешел к целым переносом запятой и добавлением в делимое или делитель нулей, если нужно). Как реализовать само деление не могу понять, делить нужно без остатка, т.е. с заданной точностью (думаю, 6 знаков после запятой хватит). Я понимаю, что нужно сравнивать делимое и делитель, если делимое>делителя, то в частное записываем 1 и вычитаем из делимого делитель, иначе записываем в частное 0, спускаем еще 1 разряд из делимого и снова сравниваем, т.е., если я правильно понимаю, реализовывать нужно с массивами, но как спускать разряды из делимого в массиве я не догадываюсь. Возможно, я неправ, тогда подскажите как реализовать, желательно сопровождать кодом.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2013, 19:18
Ответы с готовыми решениями:

Деление двоичных чисел
Ребят, очень нужна помощь! Нужно написать процедуру, которая делит два двоичных числа. Числа передаются либо массивом либо строкой. Хотел...

Деление двоичных чисел
Доброго времени суток! Помогите, пожалуйста, в решении следующий задачи: На основе имеющегося кода вычитания двоичных чисел ...

Умножение и деление двоичных чисел
На входе: Две строковых параметра, форматом 64 символа (нули и единицы) Что нужно Нужно сделать два метода возвращающих строковое...

7
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
22.10.2013, 17:12  [ТС]
Никто не знает?
0
 Аватар для Red-Cat-Fat
4 / 4 / 4
Регистрация: 11.10.2013
Сообщений: 123
22.10.2013, 19:11
Переведи двоичные числа в десятичные, подели и обратно в двоичное.
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
22.10.2013, 19:18  [ТС]
Цитата Сообщение от Red-Cat-Fat Посмотреть сообщение
Переведи двоичные числа в десятичные, подели и обратно в двоичное.
С удовольствием бы так сделал, но задача состоит именно в разработке собственного метода деления, единственное, что мне непонятно, так это как спустить еще один разряд из массива, в котором находится делимое (это вообще возможно?).
0
 Аватар для Red-Cat-Fat
4 / 4 / 4
Регистрация: 11.10.2013
Сообщений: 123
22.10.2013, 21:45
А кто узнает, каким образом производится селение?) Всё что будет иметь пользователь - ввод 2 чисел двоичной системы и ответ - результат деления, а про перевод из одной системы счисления в другую никто и не узнает
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
22.10.2013, 22:01  [ТС]
Это универская задача, реализовать нужно именно деление, а не перевод из одной СС в другую.
0
140 / 133 / 88
Регистрация: 18.05.2013
Сообщений: 399
12.11.2013, 19:03  [ТС]
Практически реализовал то, что хотел, но есть ошибки:

1). Первая проблема-это сравнение, рассмотрим на примере 100:11, т.к. я сравнение произвожу поразрядно, то на первом шаге я сравниваю поразрядно 10>=11? (1>=1? -true; 0>=1? -false) => нет, добавляю в начало делителя 0 и в делимое спускаю следующий разряд и снова проверяю поразрядно: 100>=011? (в двоичном коде 100 больше 11, но производя сравнение десятичных чисел, получается ошибка (1>=0? -true; 0>=1 -false; 0>=1 -false. Как сравнивать числа в таком случае?
2) Неправильно производится вычитание, например, 100-11 -здесь нужно в последний бит делимого записать 10, а во все остальные, кроме 1 бита (туда надо записать 0), записываем 1 и вычитаем. (на примере 100-011 будет выглядеть так: 0-первый разряд делимого, 1-второй, 10-третий, тогда при таком вычитании ответ будет правильный)Но я не могу придумать такое условие, при котором надо выполнять вычитание именно так.
3) При делении, например, 100:10 пропадает последний 0, т.к. при делении мы делим 10:10 и записываем в частное 1 и приписываем 0 из делимого в частное. В моем случае-0 просто теряется.

*примечание: это приложение windows forms, ошибочно была перенесена в этот раздел модератором.
Листинг:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
textBox15.Text = "";
            int p1 = textBox13.Text.IndexOf(',') + 1; //положение запятой в делимом
            int p2 = textBox14.Text.IndexOf(',') + 1;//положение запятой в делителе
            int length1 = textBox13.Text.Length - p1; //кол-во цифр после запятой в делимом
            int length2 = textBox14.Text.Length - p2; //кол-во цифр после запятой в делителе
            if (p1 == 0) //если введено целое делимое
                length1 = 0; //кол-во цифр после запятой: 0
            if (p2 == 0) //если введен целый делитель
                length2 = 0; //кол-во цифр после запятой: 0
 
            int d = 0; //наибольшее число цифр после запятой
 
            if (length1 > length2) //если количество знаков после запятой в делимом больше
                d = length1;
            else
                d = length2;
 
            string d1 = Convert.ToString(Convert.ToDouble(textBox13.Text) * (Math.Pow(10, d))); //делимое в целом виде
            string d2 = Convert.ToString(Convert.ToDouble(textBox14.Text) * (Math.Pow(10, d))); //делитель в целом виде 
 
            int len1 = d1.Length;
            int len2 = d2.Length;
 
            int[] delim = new int[len1];
 
            for (int i = 0; i < len1; i++)
                delim[i] = Convert.ToInt32(d1[i].ToString());
 
            int[] delit = new int[len2];
 
            for (int i = 0; i < len2; i++)
                delit[i] = Convert.ToInt32(d2[i].ToString());
 
            int[] result = new int[len1]; //временный массив
 
            int nt = len2; //кол-во разрядов, которые берем для проверки       
            
            while (len1 >= nt)
            {
                int k = 0;
                               
                for (int i = 0; i < nt; i++)
                {
                    if (delim[i] >= delit[i]) //если делимое больше или равно делителю
                        k++;
                        
                    else
                    {
                        if (nt < len1)
                        {
                            nt++; //добавляем еще 1 разряд
                            i = -1; //начинаем цикл заново с 0 эл-та
                            k = 0;
                            //увеличиваем размер массива delit1 и
                            //добавляем 0 впереди, чтобы сравнять разряды,
                            //например, 101-11 надо вычитать так: 101-011
                            len2 += 1; //увеличиваем размер массива
                            Array.Resize(ref delit, len2);
                            for (int s = len2 - 1; s > 0; s--) //сдвигаем массив к концу
                                delit[s] = delit[s - 1];
                            delit[0] = 0;
                            textBox15.Text += "0";
                        }
                    }              
                }
 
                if (k == nt)
                {
                    for (int j = nt - 1; j >= 0; j--)
                    { //выполняем вычитание с конца массива
                        if ((delim[j] == 1) && (delit[j] == 1))
                            result[j] = 0;
                        if (delim[j] == 1 && delit[j] == 0)
                            result[j] = 1;
                        if (delim[j] == 0 && delit[j] == 0)
                            result[j] = 0;
                        if (delim[j] == 0 && delit[j] == 1)
                        {
                            result[j] = 1;
                            delim[j - 1] = 0;
                        }
                        delim[j] = result[j];
                    }
                    textBox15.Text += "1";
                }
 
                nt++; //добавляем следующий разряд
                len2 += 1; //увеличиваем размер массива
                Array.Resize(ref delit, len2);
                for (int s = len2 - 1; s > 0; s--) //сдвигаем массив
                    delit[s] = delit[s - 1];
                delit[0] = 0; //в начало добавляем 0   
            }
Проект можно скачать здесь: http://rghost.ru/private/50122... 75b584177c
0
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 2
26.11.2013, 00:58
Помогите пожалуйста. Деление двоичных чисел с восстановлением остатка..
Х=00,00111110
У=11,10100001
и ещё нужно порядки
Р(х) = 1,0010
Р(у) = 0,1100
и желательно бы рассписать как делать.... спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2013, 00:58
Помогаю со студенческими работами здесь

Деление двоичных чисел с выведением остатка
Всем доброй части суток )Надо написать программу, которая конвертирует текст в двоичный код и отправляет по сети ...проблема такая:при...

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

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

Деление двоичных чисел
x = 00010111, y = 11001010 Надо разделить х на y в двоичной системе. Есть ли у кого программа, которая посчитает.

Деление двоичных чисел
Как его сделать, есть ли готовые библиотеки? Сложение XOR, требуется остаток и частное.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru