-3

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

前任。包含 0b10101010 的整数将返回 1,0b00000000 将返回 0。

4

5 回答 5

2

最初写的问题是自相矛盾的,询问 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 实际上可能不会由所有位都设置的单词表示。)

于 2012-09-10T21:57:59.157 回答
2

如果您将一个单词的所有位与所有位相加,则只有“全一”会产生 1 的结果。在您的示例中,0b10101010 会产生零而不是一。

相反,如果您对所有位进行或运算,则任何非零值都将导致 1。

因此,对于任何整数类型,以下内容都是类型安全的,无需假设补码:

int i = somevalue;

int and_bits = ~i == 0 ;
int or_bits = i != 0 ;

或者更直观地说:

int and_bits = i == ~0 ;
于 2012-09-10T22:02:52.097 回答
1

假设你有一个int i

你似乎想要的价值是

`i != 0`

这将“或”所有位。

在 MSN 的回答之后,我得到了纠正。 i == -1 将与位,假设二进制补码

于 2012-09-10T21:51:40.067 回答
1

和所有位:

i==-1

或所有位:

i!=0
于 2012-09-10T21:57:34.217 回答
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;
于 2012-09-10T22:01:00.690 回答