3

所以我有一个位序列:

1010

1 是 MSB。

如果奇数位为 0,我的函数需要返回整数 0,如果为 1,则返回 1。

我不能使用任何 for 循环或任何类似性质的东西来查看我是否需要返回 0 或 1。有没有人有任何建议如何解决这个问题。

我正在考虑使用非操作,但我可以弄清楚如何准确使用它。

到目前为止,我正在使用 1010...10 的序列,然后对其进行运算。对上述执行此操作将得到 1010。现在我需要确定我返回 1 还是 0。

4

2 回答 2

8

假设我们谈论的是 32 位整数。我假设您想知道任何 ODD 位是否为 SET (1)。

为此,我们创建一个如下所示的整数:

10101010101010101010101010101010

现在,如果我们&通过 AND ( ),所有偶数位都会被过滤掉。现在,如果数字不为零,则设置一个或多个奇数位。在 C 中:

#include <stdint.h>

int hasodd(uint32_t x) {
    // 0xAAAAAAAA = 10101010101010101010101010101010
    // double negation to turn x>0 into 1 and leave 0 alone
    return !!(x & 0xAAAAAAAA); 
}

如果您的意思是您应该返回是否设置了第 N 位,则此方法有效。它将 a 右1移到正确的位置以过滤掉所有不相关的位:

#include <stdint.h>

int nthbitset(uint32_t x, int n) {
    return x & (1 << n);
}
于 2011-08-26T22:23:09.307 回答
3

我对你的问题的意图很模糊——这似乎是家庭作业。根据您的实际需求(如问题标题或文本中所说),其中一个将在大多数C实现中起作用:

int hasoddbitset (int v)
{
     return (v & 0xaaaaaaaa) != 0;  // for 32 bit ints
}

int isbitset (int val, int bitnum)
{
     return (val & (1 << bitnum)) != 0;
}
于 2011-08-26T22:34:28.227 回答