我想检查一个二进制数是否在特定位置有'0'或'1'。检查一个二进制数是否在特定位置有'0'或'1'
例如:
如果二进制数是:101000100
- 在零位置确认(即在 最右边的 '0')应导致 '0'。
- 检查在位置2应导致 在'1'。
- 在位置3检查应导致 在'0'。
在位置6检查应得到 '1'。
等等
我编码C,所以很明显,我可以用sprintf/scanf函数和喜欢,但我想一定有什么更好的(阅读:更多的时间效率/容易)!
什么是一个很好的机制来做到这一点?
我想检查一个二进制数是否在特定位置有'0'或'1'。检查一个二进制数是否在特定位置有'0'或'1'
例如:
如果二进制数是:101000100
在位置6检查应得到 '1'。
等等
我编码C,所以很明显,我可以用sprintf/scanf函数和喜欢,但我想一定有什么更好的(阅读:更多的时间效率/容易)!
什么是一个很好的机制来做到这一点?
这将筛选出你要找位:
number & (1 << position)
如果你真的需要一个1或0的反应,你可以用它来使一个布尔值:
!!(number & (1 << position))
甚至更好(感谢Vadim K.):
(number >> position) & 1
警告:此代码是不符合标准的。 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
:
(number >> position) & 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
我假设你的号码是以int或long的形式存储的,对吗?在这种情况下,Wim的解决方案是完美的。如果你已经将它作为包含字符'0'和'1'的字符数组,那么你只需要使用'myCharArray [pos] =='1'' – MatrixFrog 2009-12-30 18:23:32