Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
#1

Нужен алгоритм сложения и умножения двоичных чисел - C#

17.11.2013, 14:12. Просмотров 2277. Ответов 20
Метки нет (Все метки)

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

Мне нужен алгоритм сложения и умножения двоичных чисел.
Перевод в десятичное число >> работа с десятичным числом >> перевод обратно в двоичное - такой вариант не подходит.
Причем числа могут быть разной длины, например, 11011010101 и 1001011.
Классы уже написал, ошибки, думаю, сложности не составят.
Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2013, 14:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужен алгоритм сложения и умножения двоичных чисел (C#):

Алгоритм умножения двоичных чисел со сдвигом вправо или влево
По причине низкого уровня в программировании(новичок) НУЖЕН АЛГОРИТМ умножения...

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

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

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

Разработать класс "Матрица" (перегрузить операции сложения, умножения, умножения на число)
Разработать класс матрица. Определить в нем конструктор перегрузить...

Алгоритм сложения чисел игры 2048
пытаюсь понять как он складывает, но у меня не получается. Вроде бы с одной...

20
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
17.11.2013, 14:17 #2
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Перевод в десятичное число >> работа с десятичным числом >> перевод обратно в двоичное - такой вариант не подходит.
Разумеется. Ведь с десятичными числами комп вообще не работает.
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 14:18 #3
BitArray поможет вам.
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 14:32  [ТС] #4
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Описать класс для работы со строкой, позволяющей хранить только двоичное число и выполнять с ним арифметические операции
Цитата Сообщение от freeba Посмотреть сообщение
BitArray поможет вам.
Мне надо самому класс написать, я его написал. Нужен только алгоритм работы именно с двоичным числом. То есть эти числа помещаются в массивы, а там уже класс складывает элементы, умножает.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
17.11.2013, 14:38 #5
А разве его у тебя нет?

Добавлено через 36 секунд
Класс же ты не написал.
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 14:46  [ТС] #6
Цитата Сообщение от taras atavin Посмотреть сообщение
А разве его у тебя нет?

Добавлено через 36 секунд
Класс же ты не написал.
Класс написал:
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
public class Binary
{
    private int _value;
    public Binary(string binValue)
    {
        _value = Convert.ToInt32(binValue, 2);
    }
    public static explicit operator Binary(string str)
    {
        return new Binary(str);
    }
    public static implicit operator int(Binary bin)
    {
        return bin._value;
    }
    public override string ToString()
    {
        return _value.ToString();
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0}", (Binary)"0010" * (Binary)"0010" + (Binary)"0001");
        }
    }
}
Нужен сам алгоритм, чтобы в класс засунуть
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 14: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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections;
using System.Linq;
 
namespace ConsoleApplication34
{
    public class BinaryNumber
    {
        BitArray number;
 
        public BitArray Bits
        {
            get { return (BitArray)number.Clone(); }
        }
 
        public BinaryNumber(string value)
        {
            number = new BitArray(value.Select(x => x == '1').ToArray());
        }
 
        public BinaryNumber(BitArray value)
        {
            number = new BitArray(value);
        }
 
        public override string ToString()
        {
            var result = string.Empty;
            for (int i = 0; i < number.Length; i++)
                result += number[i] == true ? "1" : "0";
            return result;
        }
 
        public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
        {
            return new BinaryNumber(n1.Bits.Or(n2.Bits));
        }
 
        public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2)
        {
            return new BinaryNumber(n1.Bits.And(n2.Bits));
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            BinaryNumber n1 = new BinaryNumber("110101011");
            BinaryNumber n2 = new BinaryNumber("111101111");
 
            Console.WriteLine(n1 + n2);
            Console.WriteLine(n1 * n2);
 
            Console.ReadKey(true);
        }
    }
}
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 15:26  [ТС] #8
Цитата Сообщение от freeba Посмотреть сообщение
Дерзайте
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections;
using System.Linq;
 
namespace ConsoleApplication34
{
    public class BinaryNumber
    {
        BitArray number;
 
        public BitArray Bits
        {
            get { return (BitArray)number.Clone(); }
        }
 
        public BinaryNumber(string value)
        {
            number = new BitArray(value.Select(x => x == '1').ToArray());
        }
 
        public BinaryNumber(BitArray value)
        {
            number = new BitArray(value);
        }
 
        public override string ToString()
        {
            var result = string.Empty;
            for (int i = 0; i < number.Length; i++)
                result += number[i] == true ? "1" : "0";
            return result;
        }
 
        public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
        {
            return new BinaryNumber(n1.Bits.Or(n2.Bits));
        }
 
        public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2)
        {
            return new BinaryNumber(n1.Bits.And(n2.Bits));
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            BinaryNumber n1 = new BinaryNumber("110101011");
            BinaryNumber n2 = new BinaryNumber("111101111");
 
            Console.WriteLine(n1 + n2);
            Console.WriteLine(n1 * n2);
 
            Console.ReadKey(true);
        }
    }
}
Вод чисел производится с клавиатуры
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 15:41 #9
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Вод чисел производится с клавиатуры
А в чем проблема? Console.ReadLine() - уже не в моде?
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 15:49  [ТС] #10
Цитата Сообщение от freeba Посмотреть сообщение
А в чем проблема? Console.ReadLine() - уже не в моде?
Прога выводит теже числа, но не считает
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 15:56 #11
А у меня считает

PS: Приведите пример, который не работает.
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 16:06  [ТС] #12
Цитата Сообщение от freeba Посмотреть сообщение
Кликните здесь для просмотра всего текста
Код 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 using System; using System.Collections; using System.Linq; namespace ConsoleApplication34 { public class BinaryNumber { BitArray number; public BitArray Bits { get { return (BitArray)number.Clone(); } } public BinaryNumber(string value) { number = new BitArray(value.Select(x => x == '1').ToArray()); } public BinaryNumber(BitArray value) { number = new BitArray(value); } public override string ToString() { var result = string.Empty; for (int i = 0; i < number.Length; i++) result += number[i] == true ? "1" : "0"; return result; } public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2) { return new BinaryNumber(n1.Bits.Or(n2.Bits)); } public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2) { return new BinaryNumber(n1.Bits.And(n2.Bits)); } } class Program { static void Main(string[] args) { BinaryNumber n1 = new BinaryNumber("110101011"); BinaryNumber n2 = new BinaryNumber("111101111"); Console.WriteLine(n1 + n2); Console.WriteLine(n1 * n2); Console.ReadKey(true); } } }
Вот результат, да ещё и числа надо вводить только одинаковой длины
0
Миниатюры
Нужен алгоритм сложения и умножения двоичных чисел  
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 16:23 #13
Ну и? Все правильно считает.
Цитата Сообщение от SyxaRuk Посмотреть сообщение
и числа надо вводить только одинаковой длины
Дописать метод из 15 строчек для выравнивания чисел - это неподъемная задача? А кто то бил себя пяткой в грудь и требовал только алгоритм
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Мне нужен алгоритм сложения и умножения двоичных чисел.
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 16:29  [ТС] #14
Цитата Сообщение от freeba Посмотреть сообщение
Ну и? Все правильно считает.

Дописать метод из 15 строчек для выравнивания чисел - это неподъемная задача? А кто то бил себя пяткой в грудь и требовал только алгоритм
Я сразу просил алгоритм с дополнением недостающих элементов, я не понимаю как это сделать.
А по поводу операций, программа не работает, она выводит введенные числа и все, точнее она складывает как десятичные, а мне надо с переносом разряда в старший бит
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 16:35 #15
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Я сразу просил алгоритм с дополнением недостающих элементов, я не понимаю как это сделать.
Лентяй.
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
using System;
using System.Collections;
using System.Linq;
 
namespace ConsoleApplication34
{
    public class BinaryNumber
    {
        BitArray number;
 
        public int Length { get { return number.Length; } }
        public BitArray Bits { get { return (BitArray)number.Clone(); } }
 
        public BinaryNumber(string value)
        {
            number = new BitArray(value.Select(x => x == '1').ToArray());
        }
 
        public BinaryNumber(BitArray value)
        {
            number = new BitArray(value);
        }
 
        public override string ToString()
        {
            var result = string.Empty;
            for (int i = 0; i < number.Length; i++)
                result += number[i] == true ? "1" : "0";
            return result;
        }
 
        static BinaryNumber Equalize(BinaryNumber n1, int length)
        {
            if (n1.Bits.Length >= length) return n1;
 
            var result = new BitArray(length);
            var source = n1.Bits;
            var offset = length - source.Length;
 
            for (int i = length - 1; i >= offset; i--)
                result[i] = source[i - offset];
 
            return new BinaryNumber(result);
        }
 
        public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
        {
            var n1Norm = Equalize(n1, n2.Length);
            var n2Norm = Equalize(n2, n1.Length);
            return new BinaryNumber(n1Norm.Bits.Or(n2Norm.Bits));
        }
 
        public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2)
        {
            var n1Norm = Equalize(n1, n2.Length);
            var n2Norm = Equalize(n2, n1.Length);
            return new BinaryNumber(n1Norm.Bits.And(n2Norm.Bits));
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            BinaryNumber n1 = new BinaryNumber("110101011");
            BinaryNumber n2 = new BinaryNumber("1110111");
 
            Console.WriteLine(n1 + n2);
            Console.WriteLine(n1 * n2);
 
            Console.ReadKey(true);
        }
    }
}
Цитата Сообщение от SyxaRuk Посмотреть сообщение
программа не работает, она выводит введенные числа и все
Попробуйте "1010101" и "0101010" - их сумма будет из единиц, а произведение из нулей.
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 16:44  [ТС] #16
Цитата Сообщение от freeba Посмотреть сообщение
Лентяй.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections;
using System.Linq;
 
namespace ConsoleApplication34
{
    public class BinaryNumber
    {
        BitArray number;
 
        public int Length { get { return number.Length; } }
        public BitArray Bits { get { return (BitArray)number.Clone(); } }
 
        public BinaryNumber(string value)
        {
            number = new BitArray(value.Select(x => x == '1').ToArray());
        }
 
        public BinaryNumber(BitArray value)
        {
            number = new BitArray(value);
        }
 
        public override string ToString()
        {
            var result = string.Empty;
            for (int i = 0; i < number.Length; i++)
                result += number[i] == true ? "1" : "0";
            return result;
        }
 
        static BinaryNumber Equalize(BinaryNumber n1, int length)
        {
            if (n1.Bits.Length >= length) return n1;
 
            var result = new BitArray(length);
            var source = n1.Bits;
            var offset = length - source.Length;
 
            for (int i = length - 1; i >= offset; i--)
                result[i] = source[i - offset];
 
            return new BinaryNumber(result);
        }
 
        public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
        {
            var n1Norm = Equalize(n1, n2.Length);
            var n2Norm = Equalize(n2, n1.Length);
            return new BinaryNumber(n1Norm.Bits.Or(n2Norm.Bits));
        }
 
        public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2)
        {
            var n1Norm = Equalize(n1, n2.Length);
            var n2Norm = Equalize(n2, n1.Length);
            return new BinaryNumber(n1Norm.Bits.And(n2Norm.Bits));
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            BinaryNumber n1 = new BinaryNumber("110101011");
            BinaryNumber n2 = new BinaryNumber("1110111");
 
            Console.WriteLine(n1 + n2);
            Console.WriteLine(n1 * n2);
 
            Console.ReadKey(true);
        }
    }
}


Попробуйте "1010101" и "0101010" - их сумма будет из единиц, а произведение из нулей.
Ладно, спасибо, все равно не то, что надо
0
freeba
Неадекват
1222 / 1024 / 193
Регистрация: 02.04.2010
Сообщений: 2,360
Записей в блоге: 2
Завершенные тесты: 2
17.11.2013, 17:03 #17
То, что надо?
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
public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
        {
            var n1Norm = Equalize(n1, n2.Length).Bits;
            var n2Norm = Equalize(n2, n1.Length).Bits;
            var result = new BitArray(Math.Max(n1.Length, n2.Length) + 1);
 
            var flag = false;
            for (int i = result.Length - 2; i >= 0; i--)
            {
                if (n1Norm[i] == true && n2Norm[i] == true && !flag) { result[i] = false; flag = true; }
                if (n1Norm[i] == true && n2Norm[i] == true && flag) { result[i] = true; flag = true; }
 
                if (n1Norm[i] == true && n2Norm[i] == false && !flag) { result[i] = true; flag = false; }
                if (n1Norm[i] == true && n2Norm[i] == false && flag) { result[i] = false; flag = true; }
 
                if (n1Norm[i] == false && n2Norm[i] == true && !flag) { result[i] = true; flag = false; }
                if (n1Norm[i] == false && n2Norm[i] == true && flag) { result[i] = false; flag = true; }
 
                if (n1Norm[i] == false && n2Norm[i] == false && !flag) { result[i] = false; flag = false; }
                if (n1Norm[i] == false && n2Norm[i] == false && flag) { result[i] = true; flag = false; }
            }
 
            if (flag) result[0] = true;
 
            return new BinaryNumber(result);
        }
0
SyxaRuk
0 / 0 / 1
Регистрация: 14.11.2013
Сообщений: 51
17.11.2013, 17:43  [ТС] #18
freeba,
Да, но там ошибка, щас поищу спасибо.
0
dangerpwz
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 1
10.12.2013, 21:17 #19
SyxaRuk, привет, продвинулось написание программы? Если да, то скинь, пожалуйста, последний вариант кода
0
SyxaRuk
10.12.2013, 21:22  [ТС]     Нужен алгоритм сложения и умножения двоичных чисел
  #20

Не по теме:

dangerpwz, к сожалению так ине помогло:cry: забросил эту задачу, решаю другую - задача поиска максимального потока

0
10.12.2013, 21:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 21:22
Привет! Вот еще темы с ответами:

Написать функции сложения и умножения
Помогите пожалуйста решить 2 задачи. 1)Написать функцию сложения двух чисел,...

Как сделать умножения,сложения, двух матриц с обобщением?
Привет, не могли бы вы мне помочь, у меня есть задача, и я не могу понять, как...

Обеспечить операцию выполнения сложения, вычитания, умножения через классы
Нужно написать программу. Обеспечить операцию выполнения сложения, вычитания,...

Реализовать класс векторов, переопределив операции сложения, вычитания, умножения
Реализовать класс векторов, переопределив операции сложения, вычитания,...


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

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

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