Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
M@k7
6 / 6 / 0
Регистрация: 17.10.2011
Сообщений: 165
#1

Как сложить два числа на битовом уровне? - C++

24.10.2011, 00:14. Просмотров 2316. Ответов 32
Метки нет (Все метки)

Помогите срочно надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сложить два числа на битовом уровне? (C++):

Как увеличить число на битовом уровне? - C++
1. Увеличить счетчик на 1. Значения: 31; 56; -25; 2. Операция сравнения >. Значения: 44 и 44; 46 и -7; 15 и 30; Помогите решить...

Как сложить два числа - C++
как сложить два числа в с++

Как сложить побитно два числа в двоичной с/с - C++
Добрый день форумчане! У меня программа по переводу из 10 с/с в 2 с/с. Она сделана используя битовые поля. (см. код ниже) Вопрос, а...

Как сложить два случайных числа из массива? - C++
Как сложить два случайных числа из массива с++

Как правильно сложить два больших (64 бита) числа? - C++
Допустим есть два двоичных числа A и B. Размер каждого из них = 64 бита. Вопрос такой: 1) 64 бита = 64\8 = 8 цифр, так? 2) Как их...

Сложить два больших числа - C++
Сообственно сабж.Идея понятна.Тк такого типа который может вместить все разряды не существует,я сделала такой алгоритм.Каждая цифра числа...

32
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.10.2011, 02:08 #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
M@k7, побитовое сложение - сложение каждой пары битов чисел. 229 в двоичном виде - 11100101, 110 - 1101110, теперь, сложив каждую пару битов (по правилам 0 + 0 = 0, 1 + 0 = 1, 0 + 1 = 1, 1 + 1 = 1),, получим 11101111, что и будет в десятичной системе равно 239.
11100101 + 1101110 = 101010011 = 339

Добавлено через 30 минут

Не по теме:

автор программы не я. код рабочий. протестировал. добавьте проверку чтобы нельзя было ввести ничего кроме 0 и 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
33
34
#include "stdafx.h"
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
 
int str2int(char* str) {
  int rezult=0;
  while(*str) {
      rezult=rezult*2+(*str++-'0');
  }
  //cout << rezult << endl;
  return rezult;
}
 
int main()
{
    char number_one[33],number_two[33],sum[33];
    cout << "enter first binary number" << endl;
    cin >> number_one;
    cout << "enter second binary number" << endl;
    cin >> number_two;
 
    cout << str2int(number_one) << " + "<< str2int(number_two) << " = "<< str2int(number_one)+str2int(number_two) << endl;
 
 
    printf("%032s\n+\n%032s\n=\n%032s\n", 
        number_one, number_two,itoa(str2int(number_one)+str2int(number_two),sum,2)
        );
 
system("pause");
return 0;
}
0
M@k7
6 / 6 / 0
Регистрация: 17.10.2011
Сообщений: 165
24.10.2011, 02:13  [ТС] #17
спасиба
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.10.2011, 02:16 #18
Цитата Сообщение от M@k7 Посмотреть сообщение
А можете написать как у вас это вышло
может проще начать с того момента что именно в коде вам непонятно? А как оно вышло я уже написал. все в коде.
0
M@k7
6 / 6 / 0
Регистрация: 17.10.2011
Сообщений: 165
24.10.2011, 02:17  [ТС] #19
но вводить мне то какраз нужно цыфры в десятеричной системе
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.10.2011, 04:19 #20
Цитата Сообщение от M@k7 Посмотреть сообщение
но вводить мне то какраз нужно цыфры в десятеричной системе
вот навоял вам сложение как вам надо. вводите целые положительные числа по основанию 10.

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
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <sstream>
using std::stringstream;
 
 
//записываем десятичное число в двоичном виде
void int2str(char  str[], const int * size ,int * num){
    int i = *size-1;
    while(*num/2 > 0){
        str[i] = *num -((*num/2)*2)+'0'; 
        *num = *num/2;
        i--;
    }
    str[i] = *num + '0';
}
 
 
//складываем по битам
void sum(const char num1[], const char num2[], char res[], const int *size){
    int i = *size -1;
    int add = 0;
    while(i >=0){
        if(num1[i] == '0' && num2[i] == '0') {
            if(add == 1){
                res[i] = 1 + '0';
                add = 0;
            } else{
                res[i] = 0 + '0';
            }
        } else if (num1[i] == '0' && num2[i] == '1' || num1[i] == '1' && num2[i] == '0'){
            if(add == 1){
                res[i] = 0 + '0';
                add = 1;
            } else {
                res[i] = 1 + '0';
            }
        } else if(num1[i] == '1' && num2[i] == '1') {
            if(add == 1){
                res[i] = 1 + '0';
            } else {
                res[i] = 0 + '0';
                add = 1;
            }
        }
        i-=1;
    }
 
}
 
int main(){
    const int size = 32;
    char num1[size] = {};
    char num2[size] = {};
    char res[size] = {};
    int num;
 
    //забиваем все нулями
    for(int i = 0; i < size; ++i){
        num1[i] = '0';
        num2[i] = '0';
        res[i] = '0';
    }
 
    cout << "Enter first number" << endl;
    cin >> num;
    int2str(num1, &size, & num);
 
    cout << "Enter second number" << endl;
    cin >> num;
    int2str(num2, &size, & num);
 
    sum(num1, num2, res, &size);
 
    for(int i = 0; i < size; ++i){
        cout << res[i];
    }
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 3 минуты
изменяйте значение const int size = 32; чтобы была разрядность меньше. например при сложение 229 и 110 вы получите число длиной 9 бит. посему поставте например const int size = 16; вполне достаточно.

Не по теме:

это программа рабочая. но с точки зрения компьютера и вычислений которые он проводит она примитивна и нецелесообразна.



Добавлено через 14 минут
строки
C++
1
2
#include <sstream>
using std::stringstream;
надо удалить из кода. забыл удалить после экспериментов
1
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 12:22 #21
Цитата Сообщение от greeezz Посмотреть сообщение
11100101 + 1101110 = 101010011 = 339
Это обычное арифметическое сложение двоичных чисел, а не побитовое сложение, о котором говорил я.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.10.2011, 17:38 #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
Это обычное арифметическое сложение двоичных чисел, а не побитовое сложение, о котором говорил я.
Соверешенно верно. Просто логическое или | (побитове сложение) не подходит для сумирования двух числ. Я и привел пример арифмитического сложения потому что подозреваю что автор темы пока еще не изучил разницу между ними.
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 20:16 #23
Цитата Сообщение от greeezz Посмотреть сообщение
не подходит для сумирования двух числ
Точно))

Цитата Сообщение от greeezz Посмотреть сообщение
автор темы пока еще не изучил разницу между ними
Ещё точнее.

Не по теме:

А вообще, если бы ТС хоть что-то попробовал сделать сам, то ни я, ни Jupiter не грузили бы его побитовым ИЛИ.

0
Programist_NKPC
1 / 2 / 0
Регистрация: 21.05.2015
Сообщений: 44
15.10.2017, 16:54 #24
Добавлено через 16 секунд
Объясните пожалуйста построчно данную функцию
C++
1
2
3
4
5
6
7
8
9
10
int str2int(char* str)
{
  int rezult=0;
  while(*str)
{
      rezult=rezult*2+(*str++-'0');
  }
  //cout << rezult << endl;
  return rezult;
}
0
ZRZ_CFB
3 / 3 / 0
Регистрация: 01.01.2015
Сообщений: 109
Завершенные тесты: 1
15.10.2017, 16:58 #25
Всё же очевидно... Думаю, стоило бы разобраться с основными стопами C++.
0
COKPOWEHEU
161 / 162 / 28
Регистрация: 09.09.2017
Сообщений: 723
15.10.2017, 17:34 #26
Цитата Сообщение от Programist_NKPC Посмотреть сообщение
*str++
Неочевидно и, полагаю, неверно. Скобки нужны.
Хотя нет, вроде верно. Но скобки все равно лишними не будут.
0
ZRZ_CFB
3 / 3 / 0
Регистрация: 01.01.2015
Сообщений: 109
Завершенные тесты: 1
15.10.2017, 17:38 #27
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Неочевидно и, полагаю, неверно. Скобки нужны.
Хотя нет, вроде верно. Но скобки все равно лишними не будут.
А так?
C++ (Qt)
1
2
3
4
5
6
int str2int(char* str) {
  int rezult=0;
  while(*str)
      rezult=(rezult<<1)+(*str++-'0');
  return rezult;
}
0
COKPOWEHEU
161 / 162 / 28
Регистрация: 09.09.2017
Сообщений: 723
15.10.2017, 17:47 #28
я имел в виду *(str++), явно задать приоритет сложения перед разыменованием
0
Programist_NKPC
1 / 2 / 0
Регистрация: 21.05.2015
Сообщений: 44
15.10.2017, 18:14 #29
Наиболее интересна данная строка
C++
1
rezult=rezult*2+(*str++-'0');
0
COKPOWEHEU
161 / 162 / 28
Регистрация: 09.09.2017
Сообщений: 723
15.10.2017, 19:02 #30
result*2 = result<<1 это сдвиг числа влево, переход к следующей младшей двоичной цифре
*str - '0' это прибавление к результату числа, из текущего символа строки str. Именно числа а не его ASCII кода
str++ это переход к следующему символу
1
15.10.2017, 19:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2017, 19:02
Привет! Вот еще темы с ответами:

Сложить два числа в одно - C++
Здравствуйте, есть два числа в каждом может бить цифра от 1 до 20, пример 5 17 Возможно ли эти числа записать одним который будет от -20...

Сложить два двоичных числа по модулю 2 - C++
Здравствуйте. Нужен код сложения двух двоичных чисел по модулю 2. Нужно сложить два числа так, чтобы сложение по модулю два...

Сложить два пятидесятизначных десятичных числа - C++
Сложить два пятидесятизначных десятичных числа.Плиз помогите решеть,только в С,не в С++

Сложить два пятидесятизначных десятичных числа. - C++
Пожалуйсто помогите решить задачу: Сложить два пятидесятизначных десятичных числа.


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

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

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