检查是否设置了特定位

时间:2014-04-01 03:04:15

标签: c bit-manipulation

我试图检查LSB的第2位是否已设置。 我使用以下函数来执行此操作。 如果是第1位,我可以简单地返回(uintptr_t) p & 1。 由于我正在检查第二位是否已设置,因此我再进行一次操作==。 有一种聪明的方法可以用一条指令来实现吗?

static inline bool is2ndBitSet(void* p)
{
    return ((uintptr_t) p & 2) == 2;
}

修改 我刚刚在评论中尝试了这些建议,是的,我正在做多余的比较

#include<stdio.h>
#include<stdint.h>
static inline bool is2ndBitSet(void* p)
{
    return ((uintptr_t) p & 2);
}

int main()
{
    unsigned long* ptr = (unsigned long*) 0x4;
    unsigned long* ptr1 = (unsigned long*) 0x3;
    if(is2ndBitSet(ptr))
    {
        printf("bit is set\n");
    }
    else
    {
        printf("bit is not set\n");
    }
    if(is2ndBitSet(ptr1))
    {
        printf("bit is set\n");
    }
    else
    {
        printf("bit is not set\n");
    }
    return 0;
}

输出

bit is not set
bit is set

2 个答案:

答案 0 :(得分:0)

  • 除非你真的需要规范化你的结果,否则不需要使用bool和normalize。我认为这是唯一的出路。 (直到编译器得到它。)C和C ++只接受0为false,其他都为真。
    • 如果你继续使用bool并省略自己规范化,编译器将默默地执行此操作。
  • 你似乎认为你知道比赛者会输出什么,尽管你没有。过早优化是万恶之源,这是肯定的。

答案 1 :(得分:0)

0代表 FALSE 其他任何代表 TRUE

只做if (p & 2)if (p & 0x2)应该没问题。

P.S

我只是使用十六进制值键入相同的内容导致从0到F的十​​六进制值用于表示半字节中的设置/未设置位(连续4位)如果您正在执行操作,它会使事情更容易理解操作很多。