Операции над числами в С++

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 8 мес. назад.

  • Автор
    Сообщения
  • #3657

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

    Стандартные математические операции

    Сюда входят плюсы, минусы и прочее:

    1. +: операция сложения
    2. -: операция вычитание (также служит операцией унарного минуса)
    3. /: операция деления. ВАЖНО, при работе с целыми числами округление идет вниз, т.е 5/3=1.
    4. *: операция умножения, ничего особенного.
    5. %: операция взятия по модулю. Остановимся на нем поподробнее:
    6. a % b = остаток от деления a на b.
      Например:

      5 % 3 = 2
      214 % 2 = 0
      159 % 7 = 5

      т.е

      где скобки значат округление вниз.

    Бинарные операции

    Как вы наверное знаете, в повседневной жизни мы используем десятичную систему исчисления, тогда как, все числа в компьютере хранятся в двоичном коде, т.е состоят из 1 и 0. Бинарные операции позволяют обращаться к отдельным битам числа и изменять их – например, накладывать на число маску, сдвигать и т.д. Чтобы было понятно зачем это – разберемся с тем, как вообще число из десятичной системы преобразуется в двоичную и наоборот.

    Перевод из десятичного в двоичное

    Скажем нам дан некий x

    • Шаг первый: записать x % 2
    • Шаг второй: поделить x на 2 с округлением вниз
    • Шаг третий: если x равен нулю, то закончить алгоритм, в остальных случаях, продолжать с первого шага.

    Пример для числа 179:

    • шаг 1) 179 % 2 = 1, записываем единицу
    • шаг 2) 179 / 2 = 89, теперь работаем с числом 89
    • шаг 3) переходим к первому шагу
    • шаг 1) 89 % 2 = 1, записываем единицу
    • шаг 2) 89 / 2 = 44, теперь работаем с числом 44
    • шаг 3) переходим к первому шагу
    • шаг 1) 44 % 2 = 0, записываем нуль
    • шаг 2) 44 / 2 = 22, теперь работаем с числом 22
    • шаг 3) переходим к первому шагу
    • шаг 1) 22 % 2 = 0, записываем нуль
    • шаг 2) 22 / 2 = 11, теперь работаем с числом 11
    • шаг 3) переходим к первому шагу
    • шаг 1) 11 % 2 = 1, записываем единицу
    • шаг 2) 11 / 2 = 5, теперь работаем с пятеркой
    • шаг 3) переходим к первому шагу
    • шаг 1) 5 % 2 = 1, записываем единицу
    • шаг 2) 5 / 2 = 2, теперь работаем с двойкой
    • шаг 3) переходим к первому шагу
    • шаг 1) 2 % 2 = 0, записываем нуль
    • шаг 2) 2 / 2 = 1, теперь работаем с единицей
    • шаг 3) переходим к первому шагу
    • шаг 1) 1 % 2 = 1, записываем единицу
    • шаг 2) 1 / 2 = 0, теперь работаем с нулем
    • шаг 3) x = 0, чего мы и добивались, алгоритм завершен.

    Записав все числа полученные из первого шага в обратном порядке мы получим число в двоичной записи. Для 179 мы выписали число — 11001101, перевернув ее мы получили — 10110011, это и есть наш ответ. 179[10] = 10110011[2].

    Перевод из двоичного в десятичное

    Скажем нам дано число x, которое равно, ну скажем, 1000101111011. Пронумеруем с конца все цифры в числе начиная с нуля, т.е умножаем цифры на 2 в степени ее номера, т.е:

    Складываем их: 4096 + 256 + 64 + 32 + 16 + 8 + 2 + 1 = 4475, это и есть наш ответ.

    N-ная по счету цифра в двоичном представлении числа называется n-ным битом. Запись A_n будем использовать чтобы показать, что число А записано в системе счисления с основанием n, например 12_10 – число 12 в десятичной системе счисления, а 1001_2 – число в двоичной системе.

    Вот несколько примеров битовых операций используемых в С++:

    | — битовый «или», скажем a | b = c, тогда:

    c равен 1, если или a = 1, и/или b = 1
    c равен 0 в остальных случаях.

    Пример:
    20_10 | 17_10 = 10001_2 | 10100_2 = 10101_2 = 21_10.

    ^ — битовый «исключающий или», скажем a | b = c, тогда:

    c равен 1, если или a = 1, или b = 1
    c равен 0 в остальных случаях.

    Пример:
    20_10 | 17_10 = 10001_2 | 10100_2 = 00101_2 = 5_10.

    & — битовый «и», скажем a & b = c, тогда:

    c равен 1, если и a = 1, и b = 1
    c равен 0 в остальных случаях.

    Пример:

    20_10 | 17_10 = 10001_2 | 10100_2 = 10000_2 = 16_10.

    < < — битовый «сдвиг влево»

    т.е a << b это добавление b нулей в конец двоичного представления числа a.

    47_10 << 2 = 101111_2 << 2 = 10111100_2 = 188_10.

    Также стоит добавить, что a << b = a * 2^b, для чисел в десятичной системы счисления.

    >> — битовый «сдвиг вправо»

    т.е a >> b это удаление последних b цифр в двоичном представлении числа a.

    Пример:
    47_10 >> 2 = 101111_2 >> 2 = 1011_2 = 11_10.

    Также стоит добавить, что a >> b = a / 2^b с округлением вниз, для чисел в десятичной системы счисления.

    Примеры

    #include <iostream>
    
     using namespace std;
    
     int main() {
         cout << "Enter two numbers A and B: \n";
         cin >> a >> b;
    
         cout << "A + B = " << a + b <<"\n";
         cout << "A - B = " << a - b <<"\n";
         cout << "A * B = " << a * b <<"\n";
         cout << "A / B = " << a / b <<"\n";
         cout << "A | B = " << a | b <<"\n";
         cout << "A ^ B = " << a ^ b <<"\n";
         cout << "A & B = " << a & b <<"\n";
         cout << "A << B = " << (a << b) <<"\n";
         cout << "A >> B = " << (a >> b) <<"\n";
         system ("pause");
         return 0;
    }

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

Для ответа в этой теме необходимо авторизоваться.