2014-04-17 55 views
0

我只是一个新手,当涉及到按位运算 - 如果这甚至是正确的术语 - 并且正在寻找一种更好的方法来执行逻辑整型返回码(这是各种Unix程序的标准)。即返回代码可能是1,2,4,8任意组合等解析WEXITSTATUS通过按位运算在C中求和的返回码

这里是我的代码(片段),到目前为止:

[...] 
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(&),但我不知道如何去做。虽然我并不十分了解按位操作,即如果我的确如果返回代码是128,那么if (result & 64)也可能不是真的?

显然我对二进制数学的理解是令人震惊的,我从来没有真正做过这方面的代码。只是寻找一些正确的按位方法的说明。

+1

也许更适合http://codereview.stackexchange.com/,因为您似乎有工作代码。 –

+1

'WEXITSTATUS'和''中的其他宏将为您执行所有的位操作。自己做这件事没有必要也不需要。 –

+1

'int contains_128 = result&128,contains_64 = result&64,...' – twalberg

回答

1

正如在Wumpus Q Wumbley的评论中指出的,对于“标准”公用程序/退出代码,在<sys/wait.h>中有一组宏,它们对于从退出代码中提取信息是有用的和推荐的。不过,如果你想处理的退出代码不遵循那些平常惯例,你可以用这样一个简单的逻辑与操作提取单个位:

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

如果与操作的结果是非-zero(在上述情况下,它将为0或128),则在result中设置相应的位。