2009-12-30 67 views
4

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

例如:

如果二进制数是:101000100

  • 在零位置确认(即在 最右边的 '0')应导致 '0'。
  • 检查在位置2应导致 在'1'。
  • 在位置3检查应导致 在'0'。
  • 在位置6检查应得到 '1'。

    等等

我编码C,所以很明显,我可以用sprintf/scanf函数和喜欢,但我想一定有什么更好的(阅读:更多的时间效率/容易)!

什么是一个很好的机制来做到这一点?

+1

重复数据删除:HTTP: //stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-in-c,and http://stackoverflow.com/questions/267832/explanation-of-an-algorithm-to- set-clear-and-test-a-single-bit,可能还有其他20个 – 2009-12-30 18:20:17

+1

我假设你的号码是以int或long的形式存储的,对吗?在这种情况下,Wim的解决方案是完美的。如果你已经将它作为包含字符'0'和'1'的字符数组,那么你只需要使用'myCharArray [pos] =='1'' – MatrixFrog 2009-12-30 18:23:32

回答

29

这将筛选出你要找位:

number & (1 << position) 

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

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

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

(number >> position) & 1 
+0

使其布尔值不会使其为0或1.在C++它在C中使它成真/假,表示真的实际值是(!FALSE),这并不是紧急1. – 2009-12-30 18:54:06

+2

你是对的。 ** Vadim K。**的答案'(数字>>位置)&1',对于0或1响应可能是最有效的答案。 – Wim 2009-12-30 19:06:27

+3

Martin York:一元'!'运算符的结果是0或1. – caf 2009-12-30 23:36:59

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; 
} 
+0

+1为已命名位:) – James 2009-12-30 18:35:41

+2

您还必须小心字节顺序.. – Amro 2009-12-30 19:10:01

+1

这是未定义的行为,以此方式访问工会 – avakar 2009-12-30 19:25:37

30

这个表达式求你正在寻找该位的值,可以01

(number >> position) & 1 
相关问题