【问题标题】:Determine the parity of a number using only logical operators仅使用逻辑运算符确定数字的奇偶性
【发布时间】:2012-11-15 12:29:34
【问题描述】:

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

我习惯了:

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

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

最好的问候, 杜鲁曼埃迪

【问题讨论】:

  • 逻辑 OR 和 AND,不是按位?

标签: c logical-operators


【解决方案1】:

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

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

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

【讨论】:

  • 这很奇怪,讲师要求我们只使用逻辑运算符来解决这个问题,这让我相信这是可能的。但是,这可能是他练习包中的拼写错误。
  • @edduvs:讲师可能认为按位运算符称为逻辑运算符。但否则我认为你是对的,它一定是一个词对另一个词的错字。
【解决方案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 的 &amp;&amp; 1 都会给你 1,在这种情况下,我们将除最低位之外的所有位都移开,如果它是偶数(如上),它会给你留下 0 并且 0 &amp;&amp; 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"

【讨论】:

  • 有趣的解决方案,+1(不过,为了确保您在int 的所有范围内都可以进行足够的便携移动,您应该做一些sizeof/CHAR_BITS 诡计)。
【解决方案3】:

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

【讨论】:

  • OP 说 ||&amp;&amp;,而不是 |&amp;
【解决方案4】:

逻辑||&amp;&amp; 总是 产生truefalse 值意味着10

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

if(n & 1)
  printf("odd");
else
  printf("even");

【讨论】:

  • 你把它们弄混了。如果 (n & 1) ,它应该是奇数。
【解决方案5】:

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

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

(任何体面的编译器都会在看到x%2 时自动为x&amp;1 生成代码)

之所以有效,是因为&amp;1 提取了x 的最低有效位,即1 用于奇数,0 或偶数。

【讨论】:

  • OP 说的是||&amp;&amp;,而不是|&amp;
  • 我不允许使用位运算符,只是逻辑。
  • @Mike:奥卡姆剃刀……更有可能是他被赋予了一项“正常”任务,但将逻辑运算符与按位运算混淆了,或者他被问到一个完全不可能的练习?跨度>
  • 是的,这就是为什么我在@edduvs 留下评论以求澄清。在这里的 cmets 中,实例是使用“逻辑”运算符,我的假设(下面的答案)是讲师希望他们考虑另一种可能性,例如转移位然后应用逻辑运算符。但是,是的,没有我们在场,我们都在做假设。
  • 我想我对使用逻辑运算符的实例感到困惑,但移位方法对我来说已经足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多