Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/58: Рейтинг темы: голосов - 58, средняя оценка - 4.84
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
1

Умножение двоичных чисел

08.06.2012, 21:02. Показов 10952. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи.
Исходные данные:
Количество разрядов: 4
Алгоритм умножения двоичных чисел: на один разряд множителя, начиная со старших разрядов множителя, со сдвигом частного произведения вправо.

Вопросы такие:
1) Как сделать,чтобы при сложении двух единиц,единица переносилась в след.разряд?
2) Правильно ли я сделал сам каркас кода? Не много ли переменных задействовано,просто пока я не представляю как можно сделать по другому,поэтому мне кажется,что я наворотил тут много лишнего и можно всё сделать проще

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
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Курсовой
{
    class chisla
    {
        public int x, y, i, z, summaax, summabx,summacx, 
                     summadx, summady, summadi, summadz;
        public int a, b, c, d;
        public int ax, ay, ai, az, bx, by, bi, bz, 
                   cx, cy, ci, cz, dx, dy, di, dz;
    }
    class all
    {
        static void Main()
        {
            chisla ch = new chisla();
            Random rnd = new Random();
            for (ch.x = 0; ch.x < 2; ch.x++)
            {
                for (ch.y = 0; ch.y < 2; ch.y++)
                {
                    for (ch.i = 0; ch.i < 2; ch.i++)
                    {
                        for (ch.z = 0; ch.z < 2; ch.z++)
                        {
                            for (ch.a = 0; ch.a < 2; ch.a++)
                            {
                                for (ch.b = 0; ch.b < 2; ch.b++)
                                {
                                    for (ch.c = 0; ch.c < 2; ch.c++)
                                    {
                                        for (ch.d = 0; ch.d < 2; ch.d++)
                                        {
                                            ch.x = rnd.Next(0, 2);
                                            ch.y = rnd.Next(0, 2);
                                            ch.i = rnd.Next(0, 2);
                                            ch.z = rnd.Next(0, 2);
                                            ch.a = rnd.Next(0, 2);
                                            ch.b = rnd.Next(0, 2);
                                            ch.c = rnd.Next(0, 2);
                                            ch.d = rnd.Next(0, 2);
 
                                            ch.ax = ch.a * ch.x;
                                            ch.ay = ch.a * ch.y;
                                            ch.ai = ch.a * ch.i;
                                            ch.az = ch.a * ch.z;
 
                                            ch.bx = ch.b * ch.x;
                                            ch.by = ch.b * ch.y;
                                            ch.bi = ch.b * ch.i;
                                            ch.bz = ch.z * ch.z;
 
                                            ch.cx = ch.c * ch.x;
                                            ch.cy = ch.c * ch.y;
                                            ch.ci = ch.c * ch.i;
                                            ch.cz = ch.c * ch.z;
 
                                            ch.dx = ch.d * ch.x;
                                            ch.dy = ch.d * ch.y;
                                            ch.di = ch.d * ch.i;
                                            ch.dz = ch.d * ch.z;
 
                                            ch.summaax = ch.ax + 0;
                                            ch.summabx = ch.bx + ch.ay;
                                            if (ch.summabx > 1)
                                                ch.summabx = 1;
                                            ch.summacx = ch.cx + ch.cx + ch.by + ch.ai;
                                            if (ch.summacx > 1)
                                                ch.summacx = 1;
                                            ch.summadx = ch.dx + ch.cy + ch.bi + ch.az;
                                            if (ch.summadx > 1)
                                                ch.summadx = 1;
                                            ch.summady = ch.dy + ch.ci + ch.bz;
                                            if (ch.summady > 1)
                                                ch.summady = 1;
                                            ch.summadi = ch.dz + ch.cz;
                                            if (ch.summadi > 1)
                                                ch.summadi = 1;
                                            ch.summadz = ch.dz + 0;
                                          
 
                                            Console.WriteLine("Двоичное число  " + ch.x + ch.y + ch.i + ch.z + " умножим на число  " +
                                                +ch.a + ch.b + ch.c + ch.d + " Получим результат: " + ch.summaax + ch.summabx +
                                                +ch.summacx + ch.summadx + ch.summady + ch.summadi + ch.summadz);
                                            Console.ReadLine();
 
                                        }
                                    }
                                }
                            }
 
                        }
                    }
                }
            }
        }
    }
}
Миниатюры
Умножение двоичных чисел  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2012, 21:02
Ответы с готовыми решениями:

Умножение двоичных чисел
Доброго времени суток! Я новичок в программировании. Нужно реализовать умножение двоичных ...

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

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

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

11
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
09.06.2012, 02:31 2
Может я не совсем понял вопрос. Но побитовое умножение можно сделать так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void Main(string[] args)
        {
            Random rnd = new Random();
            StringBuilder num1s = new StringBuilder(5);
            StringBuilder num2s = new StringBuilder(5);
            BitArray num1 = new BitArray(5);
            BitArray num2 = new BitArray(5);
 
            for (int i = 0; i < 5; i++)
            {
                num1[i] = rnd.Next(0, 100) < 50 ? false : true;
                num1s.Append(num1[i] ? "1" : "0");
                num2[i] = rnd.Next(0, 100) < 50 ? false : true;
                num2s.Append(num2[i] ? "1" : "0");
            }
            Console.Write("Логическое умножение {0} на {1} равно: ", num1s.ToString(), num2s.ToString());
            BitArray mul = num1.And(num2);
            for (int i = 0; i < mul.Count; i++)
                Console.Write(mul[i] ? "1" : "0");
            Console.ReadKey(true);
        }
0
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
09.06.2012, 09:39  [ТС] 3
Спасибо,но этот код я не понимаю.Что тут куда? И у меня не запускается даже.
Просто я ещё новичок в c#.
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
09.06.2012, 12:17 4
Может быть, так понятнее будет. BitArray класс специально предназначенный для битовых операций.
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
using System;
using System.Collections;
using System.Text;
 
namespace BitForum
{
    class Program
    {
        const int COUNT_BIT = 5;
        static void Main(string[] args)
        {
            Random rnd = new Random();                          //Класс для генерации случайных чисел
            StringBuilder num1s = new StringBuilder(COUNT_BIT); //Строковое представление 1го числа
            StringBuilder num2s = new StringBuilder(COUNT_BIT); //тоже для второго числа
            BitArray num1 = new BitArray(COUNT_BIT);            //Битовый массив из 5ти бит
            BitArray num2 = new BitArray(COUNT_BIT);
            
            //Заполняем битовые массивы и их строковые представления
            for (int i = 0; i < COUNT_BIT; i++)
            {
                num1[i] = rnd.Next(0, 100) < 50 ? false : true; 
                num1s.Append(num1[i] ? "1" : "0");
                num2[i] = rnd.Next(0, 100) < 50 ? false : true;
                num2s.Append(num2[i] ? "1" : "0");
            }
            
            Console.Write("Логическое умножение {0} на {1} равно: ", num1s.ToString(), num2s.ToString());
            
            //Умножаем массив num1 на num2
            BitArray mul = num1.And(num2);                      
            
            //Выводим результат умножения
            for (int i = 0; i < mul.Count; i++)
                Console.Write(mul[i] ? "1" : "0");
            
            Console.ReadKey(true);
        }
    }
}
1
Заблокирован
09.06.2012, 13:31 5
Цитата Сообщение от Burnoutman Посмотреть сообщение
Алгоритм умножения двоичных чисел: на один разряд множителя, начиная со старших разрядов множителя, со сдвигом частного произведения вправо.
Влево. Числа записываются слева-направо.
1
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
09.06.2012, 15:10  [ТС] 6
Класс! Спасибо,буду разбираться.
0
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
29.06.2012, 12:54  [ТС] 7
Люди,подскажите.Что делаю не так или чего не хватает? Не могу сложить два массива.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Курсовой
{
    class kurs
    {
        static void Main()
        {
            {
                int a,b,sum;
                Random rnd = new Random();
                int[] mat1 = new int[4];
                int[] mat2 = new int[4];
                int[] mat3 = new int[6];
                
                for (a = 0; a < 4; a++)
                {
                    Console.Write(mat1[a]=rnd.Next(0,2));
                }
                
                Console.Write(" + ");
                
                for (b = 0; b < 4;b++)
                {
                    Console.Write(mat2[b]=rnd.Next(0,2));
                }
                
                Console.Write(" = ");
                
                for (sum = 0; sum < mat3.Length;++sum)
                {
                        mat3[sum] = mat1[a] + mat2[b];
                        Console.Write(mat3[sum]);
                }
                Console.ReadLine();
 
            }
        }
    }
}
0
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
29.06.2012, 14:27 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
    static class ExtensionHelper
    {
        //Выполняняет перенос старших разрядов. Предполагается, что старший бит имеет индекс 0
        public static void Normalize(this int[] number)
        {
            for (int i = number.Length - 1; i > 0; i--)
            {
                number[i - 1] += number[i] >> 1;
                number[i] &= 1;
            }
        }
    }
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
static void Main()
        {
            Random rnd = new Random();
            int[] mat1 = new int[4];
            int[] mat2 = new int[4];
            int[] mat3 = new int[6];
 
            for (int i = 0; i < mat1.Length; i++)
            {
                Console.Write(mat1[i] = rnd.Next(2));
            }
 
            Console.Write(" + ");
 
            for (int i = 0; i < mat2.Length; i++)
            {
                Console.Write(mat2[i] = rnd.Next(2));
            }
 
            Console.Write(" = ");
 
            for (int i = 0; i < 4; i++)
            {
                mat3[i + 2] = mat1[i] + mat2[i];
            }
 
            mat3.Normalize();
            for (int i = 0; i < mat3.Length; ++i)
                Console.Write(mat3[i]);
 
            Console.ReadLine();
        }
1
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
30.06.2012, 11:00  [ТС] 9
Lasur
Я никак не могу разобраться с этим: mat3[i + 2]-Что даёт эта двойка? Просто не хочу тупо использовать ваш код,хочу сам разобраться и сделать заново ,но блин не получается
Если я у себя делаю так:

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
static void Main()
        {
            {
                int a;
                Random rnd = new Random();
                int[] mat1 = new int[4];
                int[] mat2 = new int[4];
                int[] mat3 = new int[6];
                
                for (a = 0; a < 4; a++)
                {
                    Console.Write(mat1[a] = rnd.Next(2));
                }
              
                Console.Write(" + ");
                
                for (a = 0; a < 4; a++)
                {
                    Console.Write(mat2[a] = rnd.Next(2));
                }
                
                Console.Write(" = ");
                
                for (a = 0; a < 4; ++a)
                {
                    mat3[a+2] = mat1[a] + mat2[a];
                    Console.Write(mat3[a]);
                }
 
                    Console.ReadLine();
 
                }
            }
        }
    }
То он считает,но ответ какой-то бредовый. Хелп.
Что касается переноса разрядов,то это потом,хочу для начала их просто сложить.
0
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
30.06.2012, 12:20 10
Цитата Сообщение от Burnoutman Посмотреть сообщение
mat3[i + 2]-Что даёт эта двойка?
2-разница длин между массивами mat3 и mat1(mat2) В следствии разных длин нельзя просто идти по всем индексам mat3 и складывать числа mat1 и mat2 с этими индексами - возникнет выход за пределы массива.

В вашем цикле:
C#
1
2
mat3[a+2] = mat1[a] + mat2[a];
Console.Write(mat3[a]);
выводятся только первые 4 "битовые цифры" числа mat3. Его вывод проще осуществить в отдельном цикле:
C#
1
2
for (a = 0; a < mat3.Length; a++)
    Console.Write(mat3[a]);
или в одну строку
C#
1
Console.WriteLine(string.Join(string.Empty, mat3));
Добавлено через 14 минут
Самый простой вариант (но не самый быстрый) сделать сложение независимым от размеров массивов - привести все массивы к одной длине. То есть, например, для сложения массивов
[1, 1, 1, 0, 1] и
[1, 1, 1]:

1) создать новый массив размером на один больше чем максимальный из размеров (на случай переноса разрядов) - 6 в нашем случае

2) оба массива привести к размеру нового массива, получим
[1, 0, 1, 0, 1] ---> [0, 1, 1, 1, 0, 1] (числа 010101 и 10101 равны)
[1, 1, 1] ---> [0, 0, 0, 1, 1, 1] (числа 000111 и 111 равны)

3) сложить поиндексно
[0, 1, 1, 1, 0, 1]
+
[0, 0, 0, 1, 1, 1]
=
[0, 1, 0, 2, 1, 2]

4) выполнить перенос
[0, 1, 1, 2, 1, 2]
---> [0, 1, 1, 2, 2, 0]
---> [0, 1, 1, 3, 0, 0]
---> [0, 1, 2, 1, 0, 0]
---> [0, 2, 0, 1, 0, 0]
---> [1, 0, 0, 1, 0, 0]

5) вывести
100100
0
7 / 7 / 5
Регистрация: 05.04.2012
Сообщений: 149
30.06.2012, 12:38  [ТС] 11
Lasur
Спасибо огромное! Так всё подробно!

Я так понимаю,что,если перевести с цифр на вещи, я хотел сделать нечто подобное?
Миниатюры
Умножение двоичных чисел  
0
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
30.06.2012, 13:08 12
Цитата Сообщение от Burnoutman Посмотреть сообщение
Я так понимаю,что,если перевести с цифр на вещи, я хотел сделать нечто подобное?
Как я понял, вы хотите
Цитата Сообщение от Burnoutman Посмотреть сообщение
сложить два массива
как два числа в битовом представлении.
А рисунок, где стрелки от двух массивов идут в один, может обозначать что угодно: от объединения этих двух массивов до рандомной перестановки их элементов для получения нового массива.
0
30.06.2012, 13:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2012, 13:08
Помогаю со студенческими работами здесь

Сложение двоичных чисел
Необходимо написать метод, реализующий сложение двоичных чисел. Написала, но работает не совсем...

Сложение двоичных чисел
Нужно сложить 2 двоичных числа. Написал класс с двумя методами: DecimalToBinary() - преобразует...

Калькулятор двоичных чисел
Помогите составить программу на C# калькулятор двоичных чисел (+,-,*,: )

Добавление двоичных чисел вручную
Есть задание сложить двоичные числа не используя стандартные методы (Convert...), то есть сложить...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru