Синтаксический анализ WEXITSTATUS возвращаемых суммированных кодов возврата в C с помощью побитовой операции

Я только новичок, когда дело доходит до побитовой математики - если это даже правильный термин - и искал лучший способ сделать логику для кода возврата с внутренним суммированием (как это стандартно для различных программ Unix). Т.е. код возврата может быть любой комбинацией 1,2,4,8 и т. Д.

Вот мой код (фрагмент) до сих пор:

[...]
if (result == 0)
    //no problem
else {
    if ((result > 127) && (result % 128 == 0)) {
        // exit code contained 128
        result = result - 128;
    }
    if ((result > 63) && (result % 64 == 0)) {
        // exit code contained 64
        result = result - 64;
    }
    [...]
    if (result > 0) {
        // exit code contained 1
    }
}

Я знаю, что должен быть в состоянии сделать это с помощью побитового оператора, такого как AND (&), но я не уверен, как это сделать. Я не очень понимаю о побитовых операциях, то есть, если я делаю if (result & 64) может ли это быть не так, если код возврата был 128?

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

1 ответ

Решение

Как указано в комментариях Wumpus Q Wumbley, для "стандартных" утилит / кодов выхода существует набор макросов в <sys/wait.h> которые полезны и рекомендуются для извлечения информации из кодов выхода. Однако, если коды выхода, которые вы пытаетесь обработать, не соответствуют этим обычным соглашениям, вы можете извлечь отдельные биты с помощью простой логической операции И, например:

int bit_7_is_set = result & (1U << 7);  // a.k.a. 128

Если результат операции AND не равен нулю (в приведенном выше случае это будет 0 или 128), соответствующий бит устанавливается в result,

Другие вопросы по тегам