Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Программа 35. Побитовые операторы

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

Для получения двоичного представления величин целого типа написана функция itobin. Предварительно инструкцией:

typedef char Typei;

вводится новое имя типа Typei для типа char. Тип Typei указан как тип аргумента функции itobin. Чтобы использовать itobin для другого целого типа, нужно просто переопределить тип Typei.

Алгоритм работы itobin состоит в следующем. Создается переменная onebit, имеющая вначале одну единичку в самом правом разряде. Эта величина сравнивается с аргументом n с помощью оператора & и сдвигается после каждого сравнения влево. Если результат сравнения не 0, значит в соответствующем разряде n и onebit единичка, а в противном случае 0. В строку s заносится соответствующий символ. Затем строка s реверсируется библиотечной функцией

char *strrev(char *s);

которая изменяет порядок символов в s на обратный и возвращает указатель на преобразованную строку.

// Файл BitOper.cpp

#include <string.h>

typedef char Typei; // Typei обозначает целый тип

// itobin: формирует строку из 0 и 1 с двоичным представлением n, // возвращает указатель на s

char* itobin(Typei n, char*s)

{

int i, d;

int size = sizeof(Typei) * 8; // Размер целого типа в битах

Typei onebit = 1;

// Заполнение s двоичными цифрами, начиная с последней

for(i = 0; i < size; i++, onebit <<= 1)

s[i] = n & onebit ? '1': '0';

s[i] = '\0';

strrev(s); // Реверсирование строки

return s;

}

#include <iostream.h>

#include <conio.h>

int main()

{

char s[33]; // Массив для двоичных цифр

cout << "\nРабота с беззнаковыми \n";

unsigned char p = 100, q = 200, sum, diff, q1;

cout << "p = " << int(p) << " = " << itobin(p, s) << endl;

cout << "q = " << int(q) << " = " << itobin(q, s) << endl;

sum = p + q; diff = p - q;

cout << "p + q = " << int(sum) << ", p - q = " << int(diff) << endl;

q1 = q >> 2;

cout << "q >> 2 = " << int(q1) << " = " << itobin(q1, s) << endl;

cout << "Работа со знаковыми \n";

char z = 127, z1 = z + 1;

cout << "z = " << int(z) << " = " << itobin(z, s);

cout << ", z + 1 = " << int(z1) << " = " << itobin(z1, s)<< endl;

char x = -59, y;

cout << "x = "<< int(x) << " = " << itobin(x, s) << endl;

y = x | 017;

cout << "x | 017 = " << int(y) << " = " << itobin(y, s) << endl;

y = x & 017;

cout << "x & 017 = " << int(y) << " = " << itobin(y, s) << endl;

y = x ^ 017;

cout << "x ^ 017 = " << int(y) << " = " << itobin(y, s) << endl;

y = ~x;

cout << "~x = " << int(y) << " = " << itobin(y, s) << endl;

y = x << 2;

cout << "x << 2 = " << int(y) << " = " << itobin(y, s) << endl;

y = x >> 2;

cout << "x >> 2 = " << int(y) << " = " << itobin(y, s) << endl;

getch();

return 0;

}

Для вывода числового значения переменной типа char использовано преобразование типа int(p), явно приводящее величину к типу int. Без этого преобразования инструкция

cout << p;

выводит изображение символа.

Для перехода к следующей строке экрана выводится манипулятор endl, определенный в iostream.h.

Программа выдает:

Работа с беззнаковыми

p = 100 = 01100100

q = 200 = 11001000

p + q = 44, p - q = 156

q >> 2 = 50 = 00110010

Работа со знаковыми

z = 127 = 01111111, z + 1 = -128 = 10000000

x = -59 = 11000101

x | 017 = -49 = 11001111

x & 017 = 5 = 00000101

x ^ 017 = -54 = 11001010

~x = 58 = 00111010

x << 2 = 20 = 00010100

x >> 2 = -15 = 11110001