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

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

В старые времена процессорам не хватало сложных математических инструкций. Например, если вы хотите умножить значение на шесть, выполните следующие действия:

  1. Сдвиньте значение влево на одну ступень, удвоив его. Сохраните это значение.
  2. Добавьте новое значение к себе дважды.

В C вы выражаете эту операцию для значения в переменной aследующим образом:

a <<= 1;
a += a + a;

Первое утверждение удваивает значение в a, поэтому 5 становится 10.

Второе утверждение добавляет 10 к себе один раз к 20 и к себе снова для 30: 5 * 6 = 30.

Эти утверждения представляют молекулы в двоичной арифметике, выполняя простые функции, которые выполняют основную математику. Они идеально подходят для включения в ваш код в качестве макросов. Для остроумия:

#define BYTWO(a) a<<1

BYTWO () макро умножает значение переменной aна два, в два раза его. Макрос нуждается в lvalue, поэтому результат должен быть назначен так:

x = BYTWO(4);

Этот макрос утраивает значение:

#define BYTHREE(a) a+(a<<1)

Значение переменной aдобавляется к ее двойному значению , которое также должно быть назначено так:

x = BYTHREE(4);

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

Вот еще один макрос, который я использовал в своем коде:

#define NEWLINE() putchar('\n')

NEWLINE () макрос выводит символ новой строки, которая помогает очистить вывод программы. Это удобно

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