Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/24: Рейтинг темы: голосов - 24, средняя оценка - 4.63
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
#1

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

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

Прошу помощи.
Исходные данные:
Количество разрядов: 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
Миниатюры
Умножение двоичных чисел  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2012, 21:02
Ответы с готовыми решениями:

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

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

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

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

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

11
freeba
Неадекват
1229 / 1031 / 195
Регистрация: 02.04.2010
Сообщений: 2,366
Записей в блоге: 2
Завершенные тесты: 2
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
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
09.06.2012, 09:39  [ТС] #3
Спасибо,но этот код я не понимаю.Что тут куда? И у меня не запускается даже.
Просто я ещё новичок в c#.
0
freeba
Неадекват
1229 / 1031 / 195
Регистрация: 02.04.2010
Сообщений: 2,366
Записей в блоге: 2
Завершенные тесты: 2
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
Dzhej-Dzhej
Заблокирован
09.06.2012, 13:31 #5
Цитата Сообщение от Burnoutman Посмотреть сообщение
Алгоритм умножения двоичных чисел: на один разряд множителя, начиная со старших разрядов множителя, со сдвигом частного произведения вправо.
Влево. Числа записываются слева-направо.
1
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
09.06.2012, 15:10  [ТС] #6
Класс! Спасибо,буду разбираться.
0
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
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
Lasur
258 / 248 / 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
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
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
Lasur
258 / 248 / 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
Burnoutman
6 / 6 / 4
Регистрация: 05.04.2012
Сообщений: 88
30.06.2012, 12:38  [ТС] #11
Lasur
Спасибо огромное! Так всё подробно!

Я так понимаю,что,если перевести с цифр на вещи, я хотел сделать нечто подобное?
0
Миниатюры
Умножение двоичных чисел  
Lasur
258 / 248 / 43
Регистрация: 18.03.2012
Сообщений: 506
30.06.2012, 13:08 #12
Цитата Сообщение от Burnoutman Посмотреть сообщение
Я так понимаю,что,если перевести с цифр на вещи, я хотел сделать нечто подобное?
Как я понял, вы хотите
Цитата Сообщение от Burnoutman Посмотреть сообщение
сложить два массива
как два числа в битовом представлении.
А рисунок, где стрелки от двух массивов идут в один, может обозначать что угодно: от объединения этих двух массивов до рандомной перестановки их элементов для получения нового массива.
0
30.06.2012, 13:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2012, 13:08

Сложение двоичных чисел
Нужно сложить 2 двоичных числа. Написал класс с двумя методами:...

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

Алгоритм деления двоичных чисел
Собственно нужен алгоритм которым пользуется компьютер при делении двух целых...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru