Что должна вернуть функция? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Функции

turn_bit_on()

,

turn_bit_off()

и

toggle_bit()

при передаче им некорректного номера бита должны каким-то образом проинформировать вызывающего об ошибке. На данный момент они возвращают

-1

, но ведь единички могут получиться и при корректной работе. Собственно, что должна вернуть функция в таком случае, каким образом можно обойти проблему? Может быть, просто поставить запрет на использование старшего бита?
#include <stdio.h>
 
int check_range(int);
int check_bit(int, int);
int turn_bit_on(int, int);
int turn_bit_off(int, int);
int toggle_bit(int, int);
 
int main() {
    printf("check: %d\n", check_bit(5, 0)); // 1
    printf("on: %d\n", turn_bit_on(5, 1)); // 7
    printf("off: %d\n", turn_bit_off(5, 0)); // 4
    printf("toggle on: %d\n", toggle_bit(5, 1)); // 7
    printf("toggle off: %d\n", toggle_bit(5, 0)); // 4
 
    return 0;
}
 
int check_range(int bit_id) {
    int size = sizeof(int) * 8;
 
    return (bit_id >=0 && bit_id < size) ? 1 : 0;
}
 
int check_bit(int value, int bit_id) {
    int pattern = 1;
 
    if (check_range(bit_id)) {
        pattern <<= bit_id;
        value = (value & pattern) ? 1 : 0;
    } else {
        value = -1;
    }
 
    return value;
}
 
int turn_bit_on(int value, int bit_id) {
    int pattern = 1;
 
    if (check_range(bit_id)) {
        pattern <<= bit_id;
        value |= pattern;
    } else {
        value = -1;
    }
 
    return value;
}
 
int turn_bit_off(int value, int bit_id) {
    int pattern = ~1;
 
    if (check_range(bit_id)) {
        pattern <<= bit_id;
        value &= pattern;
    } else {
        value = -1;
    }
 
    return value;
}
 
int toggle_bit(int value, int bit_id) {
    int pattern = 1;
 
    if (check_range(bit_id)) {
        pattern <<= bit_id;
        value ^= pattern;
    } else {
        value = -1;
    }
 
    return value;
}

Решение задачи: «Что должна вернуть функция?»

textual
Листинг программы
int turn_bit_on(unsigned long* const pval, const unsigned int n)
{
    if( n > 31 ) { return 0; }
    *pval &= 1 << n;
    return 1;
}

Объяснение кода листинга программы

  1. Входные данные функции:
    • pval (unsigned long* const) - указатель на переменную типа unsigned long, в которой нужно установить бит;
    • n (const unsigned int) - целочисленная константа, номер бита, который нужно установить.
  2. Выходные данные функции:
    • 1 (return 1;) - функция возвращает 1, если бит был успешно установлен, и 0 в случае ошибки (если n больше 31).
  3. Описание работы функции:
    • Проверка условия: если n больше 31, то функция возвращает 0 и прекращает выполнение.
    • Исполнение операции по установке бита в значение 1 с помощью оператора побитового И (&= 1 << n;).
    • Возврат 1.

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы