Замечание

Компилятор Borland C++ обладает функцией оптимизации: он может оптимизировать операторы и выражения. Если оператор оказался слишком запутанным, то, возможно, будет лучше разбить его на несколько выражений с использованием промежуточных значений.

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

Неявное преобразование данных

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

Совет

При разработке программ объединения могут играть уникальную роль. Объединение собирает все составляющие его типы данных в одном адресном пространстве. Эти данные не обязательно должны быть схожего типа или размера. Размещая подобные типы по одному адресу, мы можем производить с ними сложные преобразования (или маскировать биты). Размещая разнородные типы в одном адресном пространстве и введя поле флагов для индикации используемых элементов, можно экономить память. Это интересный, но редко применяемый подход.

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

одной из разновидностей упакованных значений могут служить числа в двоично-десятичном коде (Binary Coded Decimals, BCD), в котором для хранения одной десятичной цифры используется 4 бита. Двоично-десятичные числа встречаются сравнительно часто, а с упакованными числами вам придется столкнуться главным образом при написании системных программ или интерфейсов аппаратуры.

Давайте рассмотрим упакованные в формате BCD числа. Каждая тетрада (4 бита) из байта может представлять числа от 0 до 24-! (от 0 до 15). Для преобразования двоично-десятичного числа 99 в десятичное можно было бы написать такой фрагмент:

// Преобразование 99 из двоично-десятичного представления в десятичное

char bed = 0х99; // равно 9 * 16 + 9

int num = ((bed & OxFO) » 4) * 10 + (bed & OxOF); // просто ужас!