Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Другие поразрядные операторы Objective-C

0

Для полноты картины также следует упомянуть о других поразрядных операторах. Они реже используются в Objective-C, но знать о них полезно.

Исключающая операция ИЛИ

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

Рис. 33.5. Объединение двух байтов поразрядной исключающей операцией ИЛИ

Операция выполняется оператором ^. Включите в main.c следующий фрагмент:

unsigned char e = a ^ b;

printf("Hex: %x ^ %x = %x\n", a, b, e); printf("Decimal: %d ^ %d = %d\n", a, b, e); return 0; }

Программа выводит следующий результат:

Hex: 3c ^ a9 = 95 Decimal: 60 ^ 169 = 149

У неопытных программистов иногда возникают трудности с использованием этого оператора. В большинстве электронных таблиц оператор л выполняет операцию возведения в степень: 2^3 означает 23. В С возведение в степень выполняется функцией pow():

double r = pow(2.0, 3.0); // Вычисляет 2 в третьей степени

Дополнение

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

Операция выполняется оператором ~. Добавьте несколько строк в файл main.c:

unsigned char f = ~b;

printf("Hex: The complement of %x is %x\n", b, f); printf("Decimal: The complement of %d is %d\n", b, f); return 0;

}

Рис. 33.6. Дополнение

Результат должен выглядеть так:

Hex: The complement of a9 is 56 Decimal: The complement of 169 is 86

Сдвиг влево

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

«пустоты» заполняются нулями.

Рис. 33.7. Сдвиг влево на два разряда

Операция сдвига влево выполняется оператором <<. Включите в файл main.c

сдвиг на две позиции влево:

unsigned char g = a << 2;

printf("Hex: %x shifted left two places is %x\n", a, g); printf("Decimal: %d shifted left two places is %d\n", a, g);

return 0; }

Программа выводит следующий результат:

Hex: 3c shifted left two places is f0 Decimal: 60 shifted left two places is 240

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

Сдвиг вправо

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

следующий фрагмент:

unsigned char h = a >> 1;

printf("Hex: %x shifted right one place is %x\n", a, h); printf("Decimal: %d shifted right one place is %d\n", a, h);

return 0; }

Результат выполнения:

Hex: 3c shifted right one places is 1e Decimal: 60 shifted right two places is 30

Рис. 33.8. Сдвиг вправо на один разряд

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии