//пример 56.
#define PRINT(int) printf("%d\n", int)
int x=2, y=1, z=0;
| x = ((x && y) || z); PRINT(x); | (2&&1)||0) à x=1 |
| PRINT(x ||!y && z); | (истина || ((ложь) && ложь))àистина (1) |
//пример 57.
#define PRINT3(x, y, z) printf("x = %d\t y = %d\t z = %d\n", x, y, z)
int x, y, z;
x = y = z = 1;
| ++x || ++y && ++z | (x=2) à больше ничего не вычисляется |
| PRINT3(x, y, z) | x=2 y=1 z=1 |
x = y = z = 1;
| ++x && ++y || ++z | ((x=2) && ((y=2)) à истина à z не вычисляется |
| PRINT3(x, y, z) | x=2 y=2 z=1 |
x = y = z = 1;
| ++x && ++y && ++z | (x=2) && ((y=2) && (z=2) |
| PRINT3(x, y, z) | x=2 y=2 z=2 |
x = y = z = -1;
| ++x && ++y || ++z | (x=0) à ложь à y не вычисляется, à z =0 à ложь |
| PRINT3(x, y, z) | x=0 y= -1 z=0 |
x = y = z = -1;
| ++x || ++y && ++z | (x=0) à ((y=0)à ложь à z не вычисляется) |
| PRINT3(x, y, z) | x=0 y=0 z= -1 |
x = y = z = -1;
| ++x && ++y && ++z | (x=0) à ложь à y и z не вычисляется |
| PRINT3(x, y, z) | x=0 y=-1 z=-1 |
Более сложное использование поразрядных логических операций
//пример 58.
int main() // «прокрутить» операторы вручную и проверить результаты
{
Int x, y, z;
x = 03; y = 02; z = 01;
printf("%d\n", x | y & z); //3
printf("%d\n", x | y & ~z); //3
printf("%d\n", x ^ y & ~z); //1
printf("%d\n", x & y && z); //1
x = 1; y = -1;
printf("%d\n",!x | x); //1
printf("%d\n", ~x | x); //-1
printf("%d\n", x ^ x); //0
x <<= 3;
printf("%d\n", x); //8
y <<= 3;
printf("%d\n", y); //-8
y >>= 3;
printf("%d \n ", y); //-1
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
//пример 59.
С помощью поразрядной логической операции & легко найти остаток от деления на 2, 4 и т.д.:
unsigned ui, mask = 0x01; //(при делении на 2); 0x03 (на 4); 0x07 (на 8); 0x0f (на 16); 0x1f (на 32);
ui = 7;
ui & mask; //- значение разряда, который «уходит» при делении на 2 последний раз
00000111 - это 7
00000001 - это 2
------------
00000001 - это 1 (результат операции 7 & 2)
-----------------------------------------------------------------------------------------
//пример 60.
От прибора в ЭВМ поступает 16-разрядный код (справа налево номера от 0 до 15). Допустим, в разрядах 0-4 находится информация от первого датчика, 5-11 – от датчика 2, с 12 по 14 – от датчика 3. Рассмотрим алгоритм выделения информации от каждого из датчиков:
int Х, XX = 32151, x1, x2, x3; //ХX – исходная интегрированная информация
// xxxx xxxx xxx x xxxx
//x1, x2, x3 – выделенная информация от датчиков
.....
X = XX; // xxxx xxxx xxx x xxxx
x1 = X & 31; //выделяем разряды с 0 по 4: 31 = 0000 0000 0001 11112
X = X / 32; // сдвигаем Х на 5 разрядов вправо,
// аналог – команда Х >>= 5: 0000 0 x xx x xxx xxxx
x2 = X & 127; //выделяем очередные 7 разрядов, бывшие разряды 5-11
//127 = $7F = 0000 0 0 00 0111 1111
X = X / 128; // сдвигаем вправо на очередные 7 разрядов
// аналог – команда Х >>= 7: 0000 0000 0000 x xxx
x3 = X & 7; //выделяем младшие 3 разряда, бывшие 12 – 14
//7 = $7 = 0000 000 0 0000 0 111
-----------------------------------------------------------------------------------------
//пример 61.
Состояние 3-х кнопок мыши возвращается в переменной Button (тип char) в такой последовательности: левая, правая, средняя в разряды 0 –2. Тогда для анализа состояния кнопок мыши можно использовать операторы:
LeftButton = (Button & 1) == 1; //включена левая кнопка
RightButton = (Button & 2) == 2; //включена правая кнопка
LeftRightButton = (Button & 3) == 3; //включены левая и правая кнопки
MiddleButton = (Button & 4) == 4; //включена средняя кнопка
LeftMiddleButton = (Button & 5) == 5; //включены левая и средняя кнопки
-----------------------------------------------------------------------------------------
Примеры организации циклов с параметром
Цикл while в циклах с параметром
Вычисление суммы чисел натурального ряда от 1 до 10
//пример 62.
Необходимо инициализировать переменную, в которой накапливается результат: в примере это инициализация переменной summa (summa=0); при нахождении произведения натуральных чисел переменная результата инициализировалась бы единицей.
//вариант _1
const int N=10;
int main ()
{
int i = 1, summa = 0; //определение и инициализация переменных
// i является одновременно и счетчиком цикла
while (i <= N)
{ summa += i; //вычисление суммы
i++; //получение нового числа
}
cout << summa<< endl;
_getch(); // задержка на экране результатов вывода
return 0;
}
// вариант _2
const int N=10;
int main ()
{
int i = 1, summa = 0; //определение и инициализация переменных
//i является одновременно и счетчиком цикла
while (i <= N)
summa += i++; //вычисление суммы и получение нового числа
cout << summa<< endl;
_getch(); // для приостановки вывода, задержка на экране результатов
return 0;
}






