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

Арифметические операторы.

Основные арифметические операторы: сложения, вычитания, умножения, деления. В языке С++ применяются для представления арифметических действий. В С++ нет оператора возведения в степень.

+ (сложение): +x, x+y
- (вычитание): -x, x-y
* (умножение): x*y
/ (деление): x/y
% ( остаток от деления): x%y

Существуют префиксные и постфиксные операторы.
Префиксные (до) указывают C++ сначала увеличить (или уменьшить) значение переменной, а затем использовать это значение.
Постфиксные (после) указывают C++ сначала использовать значение переменной, а затем увеличить (или уменьшить) его.

 

1.2. Побитовые операторы.
К побитовым, или поразрядным операторам относятся:
операторы поразрядного И (побитовое умножение) &;
операторы поразрядного ИЛИ (побитовое сложение) |;
операторы поразрядного исключающего ИЛИ ^;
унарный оператор поразрядного отрицания ~.
оператор сдвига влево <<;
оператор сдвига вправо >>;

 

Операнды поразрядных операций могут быть любого целого типа.

Оператор & часто используется для маскирования некоторого множества битов.

Оператор | используется для включения битов

Используя оператор ^ можно обменять значения двух переменных, не используя третью: x=x^y, y=x^y, x=x^y

Оператор << (сдвиг влево) выполняет побитовый сдвиг влево левого операнда на количество разрядов, соответствующее значению правого операнда. Сдвиг на 1 бит эквивалентный умножению на 2. Результатом является целое число.

Оператор >> (сдвиг вправо): выполняет побитовый сдвиг вправо левого операнда на количество разрядов, соответствующее значению правого операнда. Если число без знака, то левые биты = 0. Сдвиг на 1 бит эквиалентный делению на 2. Результатом является целое число.

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

 

Логические операторы

В качестве операндов выступают логические значения, результат – тоже логическое значение
! (отрицание)

|| (логическое “или”)
&& (логическое “и”)

 

1.4. Операторы сравнения (отношения).
Любое значение, не равное нулю, - истина. Если тождественно равное нулю – ложь. Операторы сравнения и логические операторы не изменяют значения своих операндов, а только вычисляют значение: 0 (false), 1 (true).

Сравнивать можно операнды любого типа, но

либо они должны быть оба одного и того же встроенного типа (сравнение на равенство и неравенство работает для двух величин любого типа),
либо между ними должна быть определена соответствующая операция сравнения.

Результат – логическое значение true или false.

 

1.5. Приоритет операторов определяется круглыми скобками. В противном случае предполагается, что операторы имеют следующие относительные приоритеты.

! -(изменение знака) + + + - -(унарные)
* / %
+ -
<< >>
< <= > >= = = !=
&
^
|

&&
||
? : (условный оператор)

 

Выражения

Программа оперирует с данными. Числа можно складывать, вычитать, умножать, делить. Из разных величин можно составлять выражения, результат вычисления которых – новая величина.

Выражение, после которого стоит точка с запятой – это оператор-выражение. Его смысл состоит в том, что компьютер должен выполнить все действия, записанные в данном выражении, иначе говоря, вычислить выражение.

Выражения – это переменные, функции и константы, называемые операндами, объединенные знаками операций. Операции могут быть унарными , например, минус; могут быть бинарными. Если в выражении встречаются переменные и константы разных типов, то все они приводятся к типу с наибольшим диапазоном значений.

 

Преобразование типов

Если в выражении встречаются переменные и константы разных типов, то все они приводятся к типу с наибольшим диапазоном значений.

Для явного преобразования типа выражения используется оператор:
(<тип>) <выражение>
где в скобках – один из простых типов данных.
(int) (1.5 / 0.3); // тип int
(float) (1.5 / 0.3); // тип float

В выражении приоритет преобразования типов данных приравнивается к приоритету унарных операторов.

 

Инструкция break

Прекращает работу блока switch и циклов.

Инструкция continue.

Инструкция continue вынуждает ближайший содержащий ее цикл (for, whileили do-while) начать следующий шаг итерации. Операторы, стоящие в цикле после continue, не выполняются.

Инструкция goto.

Инструкция goto позволяет реализовать передачу программного управления из одной точки программы в другую, отмеченную мет­кой перехода. Метка перехода состоит из идентификатора и за­вершающего двоеточия, как и метки switch-оператора.

Конструкция имеет синтаксис: gotoметка;

Выход из программы exit()

С помощью функции ехit() можно прервать выполнение программы в любом месте. Такой вы­ход из программы исполь­зуется при возникновении серьезной ошибки, которая делает дальней­шее выполнение программы бессмысленным или невоз­можным.

 

 

 

2.5. Инструкция if …else.

В некоторых ситуациях необходимо указать не только оператор (блок операторов), выполняемый в случае получения результата trueпри вычислении условия, но и оператор (блок операторов), выполняемый при получении результата false.

Синтаксис инструкции выбора в этом случае будет следующим:
if (условие) оператор;
else оператор;

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

В качестве оператора может выступать отдельный оператор или блок операторов. Отдельный оператор всегда должен заканчиваться точкой с запятой (ограничителем операторов). Если используется блок операторов, то он должен быть заключен в фигурные скобки.

 

Вложение else if

С помощью ключевых слов if и else можно составлять так называемые else-if-конструкции, которые могут осуществить проверку сразу нескольких выражений, не используя сложные условия .
if (условие) оператор;
else if (условие) оператор;
else if (условие) оператор;
else оператор;

Условия проверяются в той последовательности, в которой они перечислены в программном коде.

Если результатом одного из условий является true (1),то выполняется следующий за условием оператор и проверка оставшихся elseif-условий не осуществляется.

Если ни одно из проверенных условий не дало в результате значения true,то выполняются операторы, относящиеся к последнему else.

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

 

 

Инструкция switch

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

switch (выражение) {

case константа_1: оператор; break;

case константа_2: оператор; break;

case константа_3: оператор; break;

case константа_m: оператор; break;

default: оператор;

}

Выражение должно иметь целочисленный тип. Значение выражения сопоставляется со всеми находящимися внутри switch-оператора case- константами.

Оператор, указанный после case-метки, выполняется, если значение switch-выражения равно соответствующей константе. Если ни с одной из case-констант совпадения нет, то управление передается на конструкцию с default-меткой, при условии ее наличия, в противном случае ни одна из подынструкций switch не выполняется.

Так как case-константы являются метками, то после найденного совпадения операторы будут выполняться последова­тельно до тех пор, пока не закончится switch-оператор. Поэтому после каждого блока операторов, относящегося к конкретной case-метке, необходимо указать ключевое слово (оператор) break(если это необходимо). Оператор breakсразу же передает программное управление за пределы switch-оператора, завершая его.

Оператор цикл for

Цикл for является циклом с предпроверкой условия выхода. Конструкция for-цикла имеет синтаксис: for (выражение1; выражение2; выражение3) оператор;

В выражении1 производится инициализация переменных цикла. Если выражение1 включает несколько операторов, то они должны быть разделены запятыми. Выражение1 может быть опущено в конструкции цикла, но точка с запятой после него должна быть оставлена. В качестве выражения1 применяются присваивания или вызовы функций.

Выражение2 формулирует условие выполнения цикла (т.е. если выражение2 истинно, то операторы тела цикла выполняются, в противном случае происходит выход из цикла). Если выражение2 опущено, то считается, что его значение всегда истинно. В последнем случае операторы тела цикла будут повторяться до тех пор, пока один из них не приведет к выходу из цикла.

Выражение3 выполняется после каждого прогона цикла. Здесь обычно выполняются приращения переменных цикла. Если выражение3 включает несколько операторов, то они должны быть разделены запятыми. Выражением3 может быть опущено в конструкции цикла. В выражении3 обычно применяют присваивания или вызовы функций.

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

 

3.2. Бесконечный цикл for(;;) представляет собой особый вид цикла for. Он получается, если все три элемента определения цикла for опустить и оставить только точки с запятой, разделяющие элементы.

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

 

Цикл do-while

В языке С++ существует конструкция цикла do или do-while. Самое важное его отличие от цикла while состоит в том, что операторы тела цикла do выполняются хотя бы один раз. Оценка выражения, содержащего условие выхода из цикла, происходит всегда после выполнения тела цикла. Конструкция цикла имеет синтаксис:

do оператор

while (выражение);

 

Цикл while

Цикл while является циклом с предпроверкой условия выхода. Конструкция while-цикла имеет синтаксис:
while (выражение)

оператор; //тело цикла

Если при вычислении выражения получается отличный от нуля результат, то выполняется оператор тела цикла, после чего выражение вновь вычисляется. Выражение должно иметь арифметический либо приводимый к нему тип.

В качестве оператора может выступать отдельный оператор или блок операторов. Отдельный оператор всегда должен за­канчиваться точкой с запятой (ограничителем операторов). Если тело цикла представляет собой блок операторов, то он должен быть заключен в фигурные скобки.

Выражение цикла while вычисляется прежде, чем выполняются операторы тела цикла.

Условием выхода из цикла является равенство нулю (false) выражения цикла.

Если при первом же вычислении выражения цикла while получено значение false (0), то операторы тела цикла не выполняются ни разу.

 

Алгоритм Евклида

Дана пара (a, b).
Шаг 1. Поделить a на b с остатком r
Шаг 2. Если r = 0, то НОД (a, b) = b
Шаг 3. Если r <>0, то перейти к шагу 1 с парой (b, r)

do

if (a>b)

a%=b;

else

b%=a;

while ((a !=0) && (b!=0));

 

Алгоритмы обмена чисел

Имеется две переменные a и b. Поменять их значения местами.
int a,b, tmp;
{1}
tmp = a; a = b; b = tmp;
{2}
a = a + b; b = a - b; a = a - b;
{3}
a = a ^ b; b = a ^ b; a = a ^ b;

 

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

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

При единичном значении очередного бита проверяемого числа, логическое умножение очередного значения маски на содержимое проверяемого числа маску не меняет.

int Count_Bit(int a)

{

int bit;

int mask = 1;

int num = 0;

for ( int i = 0;i <=31;i++)

{

bit=mask & a;

if (bit == mask) num++;

mask = mask << 1;

}

return num;

}