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

Например, для умножения значения на три используется следующий макрос:

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

Значение переменной aприбавляется к себе, смещено влево на одну точку, что по существу a+(a*2)или 3*a.

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

BYONE (a) 
BYTWO (a) 
BYTHREE (a) 
BYFOUR (a) 
BYFIVE (a) 
BYSIX (a) 
BYSEVEN (a) 
BYYIGHT (a) 
BYNINE (a) 
BYTEN (a)

Эти макросы используются для манипулирования значением 6, как показано этим скелетом кода:

#include <stdio.h>

/ * Макросы идут сюда * /

int main ()
{
    printf ("% d * 1 =% d \ n", 6, BYONE (6));
    printf ("% d * 2 =% d \ n", 6, BYTWO (6));
    printf ("% d * 3 =% d \ n", 6, BYTHREE (6));
    printf ("% d * 4 =% d \ n", 6, BYFOUR (6));
    printf ("% d * 5 =% d \ n", 6, BYFIVE (6));
    printf ("% d * 6 =% d \ n", 6, BYSIX (6));
    printf ("% d * 7 =% d \ n", 6, BYSEVEN (6));
    printf ("% d * 8 =% d \ n", 6, BYEIGHT (6));
    printf ("% d * 9 =% d \ n", 6, BYNINE (6));
    printf ("% d * 10 =% d \ n", 6, BYTEN (6));

    Возвращение (0);
}

Вот пример выходных данных, при условии, что макросы созданы и добавлены в скелет выше:

6 * 1 = 6
6 * 2 = 12
6 * 3 = 18
6 * 4 = 24
6 * 5 = 30
6 * 6 = 36
6 * 7 = 42
6 * 8 = 48
6 * 9 = 54
6 * 10 = 60

Макросы можно кодировать несколькими способами, хотя вы ограничены использованием операторов + и << shift. И хотя вы можете просто использовать сложение, как a+a+aдля BYTHREE () , не используйте. Посмотрите, насколько умным вы можете быть с оператором левого сдвига, чтобы макросы были максимально сжаты. Кроме того, не пытайтесь использовать определение одного макроса внутри другого.

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