检查二进制数在特定位置是否为“0”或“1”

时间:2009-12-30 18:15:51

标签: c++ c algorithm binary decimal

我想检查二进制数字在特定位置是否为“0”或“1”。

示例:

如果二进制数是:101000100

  • 在零位置检查(即在 应该导致最右边的'0' '0'。
  • 应该检查位置2 在'1'。
  • 应该检查位置3 在'0'。
  • 应该在第6位检查 在'1'。

    等...

我用C编码,所以很明显我可以使用sprintf / scanf等等,但我想必须有更好的东西(阅读:更节省时间/更容易)!

这样做的好机制是什么?

3 个答案:

答案 0 :(得分:30)

这将过滤掉您要找的位:

number & (1 << position)

如果您确实需要1或0响应,可以使用它来使其成为布尔值:

!!(number & (1 << position))

甚至更好(感谢Vadim K.):

(number >> position) & 1

答案 1 :(得分:30)

此表达式的计算结果为您要查找的位的值,01

(number >> position) & 1

答案 2 :(得分:7)

警告:此代码不符合标准。 Bjarne Stroustrup says,他应该知道,“显然,写一个成员然后读另一个成员是违法的......”不过,我将此代码留给教育目的......

这是一个替代方案,比如从套接字读取专有二进制协议时很有用:

#include <cstdlib>


union Value
{
    struct
    {
        unsigned char a_ : 1;
        unsigned char b_ : 1;
        unsigned char c_ : 1;
        unsigned char d_ : 1;
        unsigned char e_ : 1;
        unsigned char f_ : 1;
        unsigned char g_ : 1;
        unsigned char h_ : 1;
    } bits_;
    unsigned char charVal_;
};


int main()
{

    unsigned char someValue = static_cast<unsigned char>(0x42);
    Value val;
    val.charVal_ = someValue;

    bool isBitDSet = val.bits_.d_;

    return 0;
}