【问题标题】:Check whether number is even or odd without using any operator不使用任何运算符检查数字是偶数还是奇数
【发布时间】:2015-09-11 07:13:00
【问题描述】:

是否可以在不使用任何运算符的情况下在c中检查一个数字是偶数还是奇数?

【问题讨论】:

  • 你的意思是算术运算符吗?在没有任何运算符的情况下用 C 语言做一些有用的事情真的很难。
  • 无运算符?????
  • 可能更适合 codegolf.stackexchange.com
  • 不可能。如果不使用运算符(),您甚至无法调用函数。 OP,更具体!
  • @PaulR 是的。请参阅 ISO 9899:2011 §6.5.2.2 标题为“函数调用”,它是 §6.5.2“后缀运算符”的一个小节。

标签: c


【解决方案1】:

我认为您在谈论没有算术运算符

在这种情况下,您可以问自己,在二进制中,什么代表最低有效位(位 0)?

因此您可以测试该位以了解数字是奇数还是偶数:

if (number & 0x01)
{
   // odd number
}
else
{
   // even number
}

【讨论】:

  • 非常确定按位-And 被认为是算术运算符,因为它适用于数字并返回数字。
  • @LPs C 标准调用& 按位 运算符(参见ISO 9899:2011§6.5.10“按位与运算符)。逻辑运算符为&&||!
  • 我不同意。 && 是逻辑运算符,而 & 肯定是位运算符。问题是按位运算符是否也被视为算术。
  • @FUZxxl, Ultimater 是的,我的错误。我在关注HERE。它是一个位运算符。
  • @Ultimater 按位对位序列进行运算并返回位序列。这个位序列可以被解释为一个数字是巧合。
【解决方案2】:

这是一个真正有效的功能,但它有点作弊。结果封装在一个只有一个成员的结构体中,如果是奇数则为1,否则为0

struct oddness {
    unsigned int oddness : 1;
} isodd(int x) {
    struct oddness o = { x };
    return o;
}

这是因为将值分配给位域会在超出范围时导致截断。感谢kkk 的一般方法。此代码中的 = 标记不是运算符,它是 C 编程语言声明语法的一部分,参见。 ISO 9899:2011§6.7“声明”。

看!没有运营商妈妈!

【讨论】:

  • @BLUEPIXY 结果在结果的一个结构成员中。所以像这样使用它:isodd(x).oddness
【解决方案3】:

这个班轮怎么样

#define ISODD(x) (x&0x01)?"Yes":"No"

好吧,经过一番思考,我想出了这个

typedef struct {
  unsigned int bit:1;
} bitwise_t;

int main( int argc, char **argv) {
    bitwise_t x ;
    x.bit   =  atoi(argv[1]);
    printf("%d",  x.bit );
    return 0;
}

再编辑:

typedef struct {
    unsigned int bit:1;
} bitwise_t;

int isodd( int x )
{
    bitwise_t a;
    memcpy ( &a, &x , sizeof(a)) ;
    return a.bit;
}

【讨论】:

  • 这个使用两个运算符:按位与运算符& 和条件运算符?:
  • 好吧,这有点烦人,但为什么要投票,接下来的两次编辑有什么问题?
  • @kkk 函数调用也是运算符,sizeof、一元 & 和访问结构成员也是如此。不过,其余的方法都很酷。
  • @kkk 不,我没有对你投反对票。你可以像这样实现isodd,因为初始化语法在技术上不是赋值运算符,return 也不是运算符:struct oddness { unsigned int isodd:1; }; isodd(int x) { struct oddness o = { x }; return x; }
  • 请注意,函数调用也是运算符,一元 &sizeof 也是。
【解决方案4】:
#include <stdio.h>
int main()
{
int number;
printf("Enter a number to check even or odd");
scanf("%d", &number);
if(( number >> 1) <<1==number)
      printf("%d is even.", number);
else
      printf("%d is odd.", number);    
getch();

}

【讨论】:

  • 我相信 >> 和
  • 将负值向右移位的结果是在 C 中实现定义的;尝试将负值向左位移会导致 未定义的行为
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2015-05-31
  • 2013-02-02
  • 2015-02-13
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
相关资源
最近更新 更多