是否有可以对 C 中整数的所有位执行的按位运算或逻辑运算并返回 1 或 0
前任。包含 0b10101010 的整数将返回 1,0b00000000 将返回 0。
最初写的问题是自相矛盾的,询问 AND 但使用演示 OR 的示例。
对于包含任何 0 位的所有值,数字中所有位的 AND 将为 0,而仅对于所有位为 1 的特定值,将为 1。
这可以写成(i==-1)
任何有符号整数i
。对于无符号整数,测试可能最好写成((~i)==0)
或类似的东西,应用更多的类型限定。
数字中所有位的 OR 仅在 0 的特殊情况下为 0,在所有非零情况下为 1。这可以写成!!i
任何整数i
。
这是因为!
运算符(就像 C 中的所有逻辑运算符一样)被指定为以通常的方式测试逻辑真值,并且只返回适当的值 0 或 1。因此!!
,如果表达式为真,则将任意 C 表达式转换为 1,如果为假,则将其转换为 0 是一个有用的习惯用法。
(更新:重新措辞以避免表达式i+1
溢出有符号整数可能导致的未定义行为。道德:除非您真的很喜欢垃圾,否则不要对有符号整数进行按位运算。我留下了额外的 UB 永远不会在实践中会发生。有符号整数不一定是二进制补码,因此 -1 实际上可能不会由所有位都设置的单词表示。)
如果您将一个单词的所有位与所有位相加,则只有“全一”会产生 1 的结果。在您的示例中,0b10101010 会产生零而不是一。
相反,如果您对所有位进行或运算,则任何非零值都将导致 1。
因此,对于任何整数类型,以下内容都是类型安全的,无需假设补码:
int i = somevalue;
int and_bits = ~i == 0 ;
int or_bits = i != 0 ;
或者更直观地说:
int and_bits = i == ~0 ;
假设你有一个int i
你似乎想要的价值是
`i != 0`
这将“或”所有位。
在 MSN 的回答之后,我得到了纠正。 i == -1
将与位,假设二进制补码
和所有位:
i==-1
或所有位:
i!=0
在您给出的示例中,您可以简单地检查您的变量是否等于 0。如果整数中有任何位不为 0,则整数的值将大于 0。在实践中:
if (i != 0) {
//Some bits are 1.
} else {
// All bits are 0
}
或者,由于 C 自动将整数转换为布尔值:
if (i) {
...
如果您真的想从比较中得到 0 或 1 值,您可以利用更自动的类型转换将布尔值转换回整数:
int j = i != 0;