Операции с битами информации 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операции с битами информации



Операции not, and, or, xor можно использовать для побитовых операций с целыми числами, при этом тип результата определяется наименьшим типом операндов (имеющим наименьший размер). В применении к целым числам эти oneрации имеют следующий смысл:

not - унарная операция инверсии всех битов целого числа;

and - побитовая логическая операция И двух целых чисел;

or - побитовая логическая операция ИЛИ двух целых чисел;

хоr - побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ двух целых чисел.

К этой же группе можно отнести операции shl и shr, имеющие следующий смысл:

shl - операция I shl J сдвигает содержимое I на J битов влево. Освободившиеся биты заполняются нулями.

shr - операция I shr J сдвигает содержимое I на J битов вправо. Освободившиеся биты заполняются нулями.

Операции отношения

Операции отношения предназначены для сравнения двух величин (величины должны быть сравнимых типов). Результат сравнения имеет логический тип. Операции отношения следующие:

= - равно;` <= - меньше или равно;

<> - не равно; >= - больше или равно;

< - меньше; > - больше.

Примечание. Операции отношения используются также для указателей, строк, множеств. Их применение в этих случаях будет рассмотрено ниже.

Круглые скобки.

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

Порядок вычисления выражений

Вычисление значений выражений выполняется в определенном порядке. Начинается вычисление с определения переменных и констант, входящих в выражение. Они являются основой для дальнейших вычислений. Дальнейшие действия выполняются в соответствии с их приоритетами. Так, в первую очередь вычисляются выражения, заключенные в круглые скобки. Для любых двух вложенных друг в друга пар круглых скобок вычисляется сначала внутреннее выражение, а затем внешнее. Далее вычисляются значения входящих в выражение функций и т.д. Приоритеты всех действий, выполняемых при вычислении выражений, приведены в таблице 17.5.

Таблица 17.5 Приоритеты действий при вычислении выражений

Группа Тип действий Операции или элементы
  Вычисления в круглых скобках ()
  Вычисления значений функций Функции
  Унарные операции @, not, унарный +, унарный -
  Операции типа умножения *, /, div, mod, and, shl, shr
  Операции типа сложения +, -, or, xor
  Операции отношения =, <>, <, >, <=, >=, in

 

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

17.2 Основные конструкции языка C

Константы

Константы в C бывают числовые, символьные и строковые. Числовые константы делятся на целочисленные и вещественные.

Целочисленные константы

Целочисленные данные в языке C могут быть представлены в одной из систем счисления представленных в таблице 17.6.

Таблица 17.6 Целочисленные системы исчисления

Десятичные Последовательность цифр (0 — 9), которая начинаются с цифры, отличной от нуля. Пример: 1, -29, 385. Исключение — число 0.
Восьмеричные Последовательность цифр (0 — 7), которая всегда начинается с 0. Пример: 00, 071, -052, -03.
Шестнадцатеричные Последовательность шестнадцатеричных цифр (0 — 9 и A — F), которой предшествует присутствует 0x. Пример: 0x0, 0x1, -0x2AF, 0x17.

 

В зависимости от значения целой константы компилятор присваивает ей тот или иной тип (char, int, long int).

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

Например, Константе 200 U выделяется 1 байт, и старший бит используется для представления одного из разрядов кода числа и диапазон значений становится от 0 до 255. Суффикс L (или l) позволяет выделить целой константе 8 байт (long int).

Совместное использование в любом порядке суффиксов U (или u) и L (или l) позволяет приписать целой константе тип unsigned long int, и она займет в памяти 64 разряда, причем знаковый разряд будет использоваться для представления разряда кода (а не знака).

Вещественные константы

Константа с плавающей точкой (вещественная константа) всегда представляется числом с плавающей точкой двойной точности, т. е. как имеющая тип double, и состоит из следующих частей:

- целой части — последовательности цифр;

- точки - разделителя целой и дробной части;

- дробной части — последовательности цифр;

- символа экспоненты е или E;

- экспоненты в виде целой константы (может быть со знаком).

По умолчанию компилятор присваивает вещественному числу тип double. Если программиста не устраивает тип, который компилятор приписывает константе, то тип можно явно указать в записи константы с помощью следующих суффиксов: F (или f) — float для простых вещественных констант, L (или l) — long double для вещественных констант двойной расширенной точности.

Символьные константы

В качестве символьных констант могут использоваться символы, например: ' z ', или управляющие коды (табл. 17.7), не имеющие графического представления. При этом код управляющего символа начинается с символа '\' (обратный слеш).

Таблица 17.7Управляющие коды

Код Обозначение Описание
0x00 '\0' Нуль-символ, NULL
0x07 '\a' Звуковой сигнал.
0x08 '\b' Возврат на 1 шаг (Backspace)
0x09 '\t' Горизонтальная табуляция (Tab)
0x0A '\n' Перевод строки (Enter)
0x0B '\v' Вертикальная табуляция (в консоли аналогична переводу строки)
0x0C '\f' Смена страницы
0x0D '\r' Возврат каретки

 

Все символьные константы имеют тип char и занимают в памяти 1 байт. Значением символьной константы является числовое значение её внутреннего кода.

Строковые константы

Строковая константа в языке C представлена в виде последовательности символов, заключенной в кавычки, например:

"Это строковая константа"

Кавычки не входят в строку, а лишь ограничивают её. Технически строковая константа представляет собой массив символов, и по этому признаку может быть отнесена к разряду сложных объектов языка C.

В конце каждой строковой константы компилятор помещает '\0' (нуль-символ), чтобы программе было возможно определить конец строки. Такое представление означает, что размер строковой константы не ограничен каким-либо пределом, но для определения длины строковой константы её нужно полностью просмотреть.

Поскольку строковая константа состоит из символов, то она имеет тип char. Количество ячеек памяти, необходимое для хранения строковой константы на 1 больше количества символов в ней (1 байт используется для хранения нуль-символа).

Символьная константа ' x ' и строка из одного символа " x " - не одно и то же. Символьная константа – это символ, используемый для числового представления буквы x, а строковая константа " x " содержит символ ' x ' и нуль-символ '\0' и занимает в памяти 2 байта. Если в программе строковые константы записаны одна за другой через разделители, то при выполнении программы они будут размещаться в последовательных ячейках памяти.

Переменные

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

Объявление переменных в C осуществляется в форме:

ТипПеременной ИмяПеременной;

Каждую переменную можно снабдить комментарием, поясняющим ее смысл. Например,

int i; // счетчик циклов

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

int i, n;

При объявлении переменной ей может быть присвоено начальное значение в форме:

ТипПеременной ИмяПеременной = значение;

Например,

int i=0, k, n, m=1;

float pi=3.1415, y;

char a='a';

Функции

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

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

Рекурсивные функции

Функция, которая вызывает сама себя, называется рекурсивной функцией.

Рекурсия - вызов функции из самой функции.

Пример рекурсивной функции – функция вычисления факториала:

#include <stdio.h>

int fact(int num) {

if(num==1) return(1);

else return(num*fact(num-1)); // рекурсивный вызов

}

int main() {

int a, r;

printf("a= ");

scanf("%d",&a);

r = fact(a);

printf("%d! = %d",a,r);

getchar();getchar();

return(0);

}

Математические функции

Математические функции хранятся в стандартной библиотеке math.h. Аргументы большинства математических функций имеют тип double. Возвращаемое значение также имеет тип double. Углы в тригонометрических функциях задаются в радианах.

Основные математические функции стандартной библиотеки представлены в таблице 17.8.


Таблица 17.8 Основные математические функции стандартной библиотеки C

Функция Описание
int abs(int x) Модуль целого числа x
double acos(double x) Арккосинус x
double asin(double x) Арксинус x
double atan(double x) Арктангенс x
double cos(double x) Косинус x
double cosh(double x) Косинус гиперболический x
double exp(double x) Экспонента x
double fabs(double x) Модуль вещественного числа
double fmod(double x, double y) Остаток от деления x/y
double log(double x) Натуральный логарифм x
double log10(double x) Десятичный логарифм x
double pow(double x, double y) x в степени y
double sin(double x) Cинус x
double sinh(double x) Cинус гиперболический x
double sqrt(double x) Квадратный корень x
double tan(double x) Тангенс x
double tanh(double x) Тангенс гиперболический x

Знаки операций

Над объектами в языке Си могут выполняться различные операции:

§ операции присваивания;

§ операции отношения;

§ арифметические;

§ логические;

§ cдвиговые операции.

Результатом выполнения операции является число.

Операции могут быть бинарными или унарными. Бинарные операции выполняются над двумя объектами, унарные — над одним.

Операция присваивания

Операция присваивания обозначается символом = и выполняется в два этапа:

- вычисляется выражение в правой части;

- результат присваивается операнду, стоящему в левой части:

объект = выражение;

Пример:

int a = 4; // переменной a присваивается значение 4

int b;

b = a + 2; // переменной b присваивается значение 6,

// вычисленное в правой части

 

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

объект = (тип)выражение;

float a = 241.5;

// Перед вычислением остатка от деления

// a приводится к целому типу

int b = (int)a % 2; // b = 1

Операции отношения

Основные операции отношения:

== эквивалентно — проверка на равенство;

!= не равно — проверка на неравенство;

< меньше;

> больше;

<= меньше или равно;

>= больше или равно.

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

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

Основные бинарные операции, расположенные в порядке уменьшения приоритета:

- умножение *;

- деление /;

- сложение +;

- вычитание -;

- остаток от целочисленного деления %.

Основные унарные операции:

- инкрементирование (увеличение на 1) ++;

- декрементирование (уменьшение на 1) --;

- изменение знака -.

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

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

Пример:

int a=2;

int b=3;

int c, d;

c = a*++b; // c=8, поскольку в операции умножения уже b=4

d = a*b++; // d=6, поскольку в операции умножения b=3

Бинарные арифметические операции могут быть объединены с операцией присваивания:

- объект *= выражение; // объект = объект * выражение

- объект /= выражение; // объект = объект / выражение

- объект += выражение; // объект = объект + выражение

- объект -= выражение; // объект = объект - выражение

- объект %= выражение; // объект = объект % выражение

Логические операции

Логические операции делятся на две группы:

- условные;

- побитовые.

Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:

- 1 если выражение истинно;

- 0 если выражение ложно.

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

Основные условные логические операции:

- && - И (бинарная) — требуется одновременное выполнение всех операций отношения;

- || - ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;

-! - НЕ (унарная) — требуется невыполнение операции отношения.

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

Основные побитовые логические операции в языке Си:

- & конъюнкция (логическое И) - бинарная операция, результат которой равен 1 только когда оба операнда единичны (в общем случае - когда все операнды единичны);

- | дизъюнкция (логическое ИЛИ) - бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;

- ~ инверсия (логическое НЕ) - унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;

- ^ исключающее ИЛИ - бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).

Пример:

unsigned char a = 14; // a = 0000 1110

unsigned char b = 9; // b = 0000 1001

unsigned char c, d, e, f;

c = a & b; // c = 8 = 0000 1000

d = a | b; // d = 15 = 0000 1111

e = ~a; // e = 241 = 1111 0001

f = a ^ b; // f = 7 = 0000 0111

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

Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:

unsigned char a = 3;

a = a | 0x04; // a = 7, бит 2 установлен

Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:

unsigned char a = 3;

a = a & (~0x02); // a = 1, бит 1 сброшен

Бинарные побитовые логические операции могут быть объединены с операцией присваивания:

- объект &= выражение; // объект = объект & выражение

- объект |= выражение; // объект = объект | выражение

- объект ^= выражение; // объект = объект ^ выражение

Сдвиговые операции

Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:

- >> - сдвиг вправо;

- << - сдвиг влево.

Общий синтаксис осуществления операции сдвига:

объект = выражение сдвиг КоличествоРазрядов;

Пример:

unsigned char a=6; // a = 0000 0110

unsigned char b;

b = a >> 1; // b = 0000 0110 >> 1 = 0000 0011 = 3

Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.

Арифметический сдвиг целого числа влево << на 1 разряд соответствует умножению числа на 2.

Круглые скобки

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



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 165; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.0.192 (0.103 с.)