仅使用逻辑运算符确定数字的奇偶校验

时间:2012-11-15 12:29:34

标签: c logical-operators

当我尝试使用逻辑运算符(||,&&)确定数字是否均匀/不均匀时,我有点困惑。

我习惯了:

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

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

祝你好运, Duluman Edi

5 个答案:

答案 0 :(得分:4)

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

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

如果你需要正式证明它,你可以通过强引导来做到这一点,因为任何只涉及那两个运算符的表达式,总共包含n个运算符,必​​然等同于表达式(A) && (B)(A) || (B),其中AB是仅涉及这两个运算符且总共包含少于n个运算符的表达式。用n == 1证明基本案例很简单。

答案 1 :(得分:2)

对于一个整数,你可以使用和运算符x & 1来测试第0位值,即偶数为0,奇数为1。

答案 2 :(得分: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

现在有1个非0号码,所以我们得到"it's odd"

答案 3 :(得分:1)

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

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

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

这是有效的,因为&1提取x的最低有效位,对于奇数和1或偶数,它是0

答案 4 :(得分:1)

逻辑||&& 始终会产生truefalse值意味着10。< / p>

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

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