2

当我尝试仅使用逻辑运算符(||,&&)来确定一个数字是否是偶数/奇数时,我有点困惑。

我习惯:

if (x%2)
   printf("Number is even");
else
   printf("Number is not even");

是否有任何算法可以确定数字的奇偶性?如果有,你能给我一些文件吗?

最好的问候, 杜鲁曼·埃迪

4

5 回答 5

4

&&仅使用逻辑运算符和是不可能的||

在任何只涉及&&and的表达式中||,您可以将值0x01(奇数)替换为(0x10偶数),结果将是相同的,因为就逻辑运算符而言,这两个值在逻辑上都是“真”。因此,该表达式不区分两者。

如果你需要正式证明它,你可以通过强归纳来做到这一点,即任何只涉及这两个运算符并且总共包含n运算符的表达式必然等价于(A) && (B)or形式的表达式(A) || (B),其中AB是涉及的表达式只有这两个运算符并且总共包含少于n运算符。证明基本情况n == 1很简单。

于 2012-11-15T12:50:39.837 回答
2

对于整数,您可以使用 and 运算符x & 1来测试位 0 的值,即 0 表示偶数,1 表示奇数。

于 2012-11-15T12:33:42.343 回答
2

可以先换行吗?如果仅使用 1 位,则可以使用逻辑运算符完成相同的“位”逻辑,例如:

int num = 0x14; // 0000 0000 0001 0100
unsigned short shift_num = num << 15; // 0000 0000 0000 0000

if(shift_num && 1)
    printf("it's odd\n");
else
    printf("it's even\n");

因此,任何非 0&& 1都给您 1,在这种情况下,我们将除最低位之外的所有位都移开,如果它是偶数(如上),它会给您留下 0 并且0 && 1是假的,所以"it's even"会打印出来。如果我们使用奇数:

int num = 0x15; // 0000 0000 0001 0101
unsigned short shift_num = num << 15; // 1000 0000 0000 0000

现在有一个非 0 数字和 1 所以我们会得到"it's odd"

于 2012-11-15T13:46:45.193 回答
1

假设您的意思是按位运算&|(因为它们的逻辑短路对应物没有解决方案):

if(x&1)
    puts("odd");
else
    puts("even");

x&1(并且任何体面的编译器都会在看到时自动发出代码x%2

这是有效的,因为&1提取了 的最低有效位x,即1奇数和0偶数。

于 2012-11-15T12:32:24.647 回答
1

合乎逻辑||&& 总是产生truefalse值的意思是1or 0

我认为您对此感到困惑,|| &&后来& |的运算符是按位运算符,使用按位可以找到偶数和奇数

if(n & 1)
  printf("odd");
else
  printf("even");
于 2012-11-15T12:41:29.437 回答