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

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

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

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

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

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

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

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

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

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

20
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
17.11.2013, 14:17 #2
Цитата Сообщение от SyxaRuk Посмотреть сообщение
Перевод в десятичное число >> работа с десятичным числом >> перевод обратно в двоичное - такой вариант не подходит.
Разумеется. Ведь с десятичными числами комп вообще не работает.
0
freeba
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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 / 1765 / 211
Регистрация: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Неадекват
1250 / 1050 / 200
Регистрация: 02.04.2010
Сообщений: 2,409
Записей в блоге: 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
Привет! Вот еще темы с ответами:

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

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

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


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

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

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