有没有一种方法可以将c中整数的所有位相加,得到一个简单的1或0?

有没有一种方法可以将c中整数的所有位相加,得到一个简单的1或0?,c,C,是否有一种按位运算或逻辑运算可以对C中整数的所有位执行,并返回1或0 例如,包含0b10101010的整数将返回1,0b00000000将返回0。假设您有一个int i 你似乎想要的价值是 `i != 0` 它将“或”所有位 在MSN的回答之后,我被纠正了。i==-1将显示和位,假设两个的补码和所有位: i==-1 i!=0 或所有位: i==-1 i!=0 最初写的问题是自相矛盾的,询问,但使用了一个例子来演示 对于包含任何0位的所有值,数字中所有位的AND将为0,对于包含所有1位的

是否有一种按位运算或逻辑运算可以对C中整数的所有位执行,并返回1或0

例如,包含0b10101010的整数将返回1,0b00000000将返回0。

假设您有一个int i

你似乎想要的价值是

`i != 0`
它将“或”所有位

在MSN的回答之后,我被纠正了。i==-1将显示和位,假设两个的补码和所有位:

i==-1
i!=0
或所有位:

i==-1
i!=0

最初写的问题是自相矛盾的,询问,但使用了一个例子来演示

对于包含任何0位的所有值,数字中所有位的AND将为0,对于包含所有1位的特定值,AND将仅为1

对于任何有符号整数i,都可以写成i=-1。对于无符号整数,最好将测试写成~i==0或类似的形式,并应用更多类型限定

数字中所有位的OR仅在特殊情况下为0,在所有非零情况下为1。这可以写成!!i表示任何整数i

这是因为!与C中的所有逻辑运算符一样,运算符被指定以通常的方式测试逻辑真值,并根据需要仅返回值0或1。所以是将任意C表达式转换为1(如果表达式为true)或0(如果为false)的有用习惯用法


更新:重写以避免表达式i+1溢出有符号整数可能导致的未定义行为。寓意:除非你真正喜欢有符号整数,否则不要对有符号整数进行逐位运算。我留下了一点额外的UB,这在实践中从未发生过。有符号整数不必是2的补码,因此-1实际上可能不是由设置了所有位的字来表示的。

在您给出的示例中,您可以简单地检查变量是否等于0。如果整数中有任何位不是0,则整数的值将大于0。实际上:

if (i != 0) {
    //Some bits are 1.
} else {
    // All bits are 0
}
或者,由于C会自动将整数转换为布尔值:

if (i) {
    ...
如果确实希望从比较中获得0或1值,可以利用更自动的类型转换将布尔值转换回整数:

int j = i != 0;

如果对一个单词的所有位进行AND运算,则只有所有位的结果都是1。在您的示例中,0b10101010将生成零而不是一

如果您将所有位改为OR'ed,则任何非零值都将导致1

因此,对于任何整数类型,在不假设两个s-补码的情况下,以下是类型安全的:

int i = somevalue;

int and_bits = ~i == 0 ;
int or_bits = i != 0 ;
或者更直观地说:

int and_bits = i == ~0 ;

对0x10101010中的所有位进行ANDing运算将得到0。你是说ORing?标准是什么?是否每个非零输入都会产生1?还是平等?还是什么?很简单。对任何0进行anding运算都会得到一个零,所以基本上只要你的var==0{都是零}就可以了。标题和问题不匹配。所有的位都是1&0&1&0。。。第一个例子0不能获得二进制和整数的所有位的效果。虽然对不太了解的人来说更加模糊,但pmg的解决方案是好的。对于条件表达式来说,这个值就足够了。当问题仍然模棱两可时,你怎么知道答案是什么?不是i=-1吗?必须设置所有位eeha@Sam:标题上写着和,示例是OR。看看我的答案;我认为它涵盖了这两个选项。那不是I==-1吗?还有一个条件是机器-1被表示为2的补码?@Clifford,嗯。。是的,应该是这样。我喜欢这样,但这让我不得不思考——所以我更喜欢我的;——。AND解决方案不适用于具有未定义行为的INT_MAX i+1溢出。是的,我一直忘了有符号整数在标准中几乎没有保证。在许多体系结构和实现中,签名和未签名实际上只是同一基础ALU的不同观点,没有溢出。该标准允许溢出,并保证不会击中该情况是一种痛苦。我将改写答案以避开UB。