【问题标题】:Checking even or odd `1` bits in a number检查数字中的偶数或奇数“1”位
【发布时间】:2012-10-13 19:05:08
【问题描述】:

我想检查 number 是否将所有偶数位或奇数位都设置为 1,并且只有它们。例如:

数字42 是正确的,因为在二进制代码101010 中,它的所有且只有偶数位设置为1。 号码21也正确,10101

号码69 例如。 1000101 不正确,因为1 只有三个奇数位。

我已经尝试对^, &, >>, << 使用不同的操作,但我仍然不知道如何使用这些操作符来做到这一点。是的,我需要在C 中使用逻辑运算符来执行此操作。

【问题讨论】:

  • 判断一个数是奇数还是偶数,只需要检查最后位即可。
  • 你这样做的目的是什么?
  • 这个问题之前已经被问过[很多次] ..

标签: c bitwise-operators bit logical-operators


【解决方案1】:

这些数字具有 (x ^ (x >> 1)) + 1 是 2 的幂的属性。如果 y & (y - 1) == 0y 是 2 的幂

所以一个测试可能是((x ^ (x >> 1)) + 1) & (x ^ (x >> 1)) == 0,它适用于任何大小的数字。

【讨论】:

  • 很好,但是将(x ^ (x >> 1)) 存储在单独的变量 y 中会更好,因为程序不再需要重新计算该表达式的值
【解决方案2】:
#include <stdio.h>

int main(void)
{
    unsigned uu;

    for (uu=0; uu < 43; uu++ ) {
        int res;
        res = (((uu & 0xAAAAAAAA) == uu) || ((uu & 0x55555555) == uu) );
        printf("%u: %d\n", uu, res);
    }
    return 0;
}

【讨论】:

  • 如果人们开始评论(或纠正)空白,非空白必须是正确的;-)
  • 0 可以被认为是极端情况,因为它根本没有设置位。 (但至少它没有设置 wrong 位 ;-) 根据要求,您当然可以单独排除零。
  • 这会返回 69 的“true”,这应该是不正确的。
【解决方案3】:
bool isEven(int n){
   bool isEven = true;
   while(n){
      if( n & 1 ){
          isEven = !isEven;
      }
      n = n >> 1;
   }

   return isEven;
}

只要 n 为 != 0,while(n) 就会继续,即仍然有一个。 如果第一位是一个,那么我们将偶数参数更改为相反的(偶数变为奇数,反之亦然),在每次迭代中,我们将第一个位向右移动。

【讨论】:

  • 贴代码没用,请1或2行说明。
  • 这没有回答所提出的问题。这将检查数字是否设置了偶数或奇数位。问题是检查是否设置了所有奇数位,或者是否设置了所有偶数位。
  • 我不需要检查数字是否是偶数。我想检查数字的所有偶数位是否等于1,所有奇数位是否等于0。第二种情况是对称的。
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2018-06-10
  • 2015-05-31
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多