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

mik*_*ike 4 c c++ algorithm binary decimal

我想检查二进制数在特定位置是否有'0'或'1'.

例:

如果二进制数是:101000100

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

    等等...

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

这样做的好机制是什么?

Wim*_*Wim 31

这将过滤掉您正在寻找的位:

number & (1 << position)
Run Code Online (Sandbox Code Playgroud)

如果你真的需要1或0响应,你可以使用它来使它成为一个布尔值:

!!(number & (1 << position))
Run Code Online (Sandbox Code Playgroud)

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

(number >> position) & 1
Run Code Online (Sandbox Code Playgroud)

  • Martin York:一元`!`运算符的结果是0或1. (3认同)
  • 你是对的.**Vadim K.**的答案,`(数字>>位置)和1`,可能是0或1响应中最有效的答案. (2认同)

Vad*_* K. 30

此表达式计算为您要查找的位的值,0或者1:

(number >> position) & 1
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 7

警告:此代码不符合标准. Bjarne Stroustrup说,并且他应该知道,"显然,写一个成员然后读另一个成员是违法的......"不过我把这些代码留给教育目的......

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个黑客.即使在一个给定的平台内也是一个黑客.最重要的是,它不能在平台之间移植.我完全没有理由为什么有人会使用这样的东西而不是明显的移位和测试解决方案. (6认同)