Что делает программа?

Вот есть такой код

#define MASK 0x15

int main() {

    char A[5] = {'a', 'B', 'c', 'D', 'e'};
    int I, RES = 0;
    for (I = 0; I < 5; I++)
        if ((A[I] & MASK) == MASK)
            RES++;
    printf("\n The result is : %d ", RES);
}

Нужно обьяснить, что он делает. Я насколько понял у нас есть масив из char, програма бежит по масиву и если биты этого чара содержаться в MASK то RES увеличиваем на 1.

Но у меня printf() показывает всегда 0. Я так понимаю, что либо есть ошибка в коде либо программа делает не то, что я думаю


Ответы (2 шт):

Автор решения: Centrix

В вашем коде, описание функции printf, содержится в заголовочном файле stdio.h, так как ввод-вывод не является встроенной возможностью C, то для использования printf вы обязаны подключить файл stdio.h.
Но это пол беды, в коде вы проверяете: (A[I] && MASK) == MASK, это означает, что сначала мы производим операцию И над элементом массива и маской, после чего сравниваем результат со значением маски, из этого следует что инкрементирование счётчика произойдёт только если значение элемента массива равно 21 (0x15), так что программа работает верно.

→ Ссылка
Автор решения: AlexGlebe

if ((A[I] & MASK) == MASK) это контроль указанных битов. В вашем случае MASK 0x15 указывает на три бита 10101. Если в данных эти биты присутствуют, то результатом будет сама маска, а если один из этих битов равен нулю, то результат будет не равен маске.

Например 'a' == 97 == 0x61 == 1100001. Маска 10101 даст результат 00001. То есть один бит правильный, а два других нет.

Зачем у вас такая маска не знаю. Я бы считал количество маленьких букв с помощью маски 0x20.

→ Ссылка