C / C ++检查是否有一个位被设置,即intvariables
int temp = 0x5E; // in binary 0b1011110.
有没有这样的方法来检查位3的温度是1还是0,没有位移和掩码。
只是想知道是否有一些内置的function,或者我不得不自己写一个。
在C中,如果你想隐藏位操作,你可以写一个macros:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
并以这种方式使用它:
CHECK_BIT(temp, 3)
在C ++中,你可以使用std :: bitset 。
检查位N(从0开始)是否被设置:
temp & (1 << N)
这没有内build的function。
如果是C ++,我只会使用std :: bitset。 简单。 直截了当。 没有机会出现愚蠢的错误。
typedef std::bitset<sizeof(int)> IntBits; bool is_set = IntBits(value).test(position);
或者这个愚蠢的事情呢?
template<unsigned int Exp> struct pow_2 { static const unsigned int value = 2 * pow_2<Exp-1>::value; }; template<> struct pow_2<0> { static const unsigned int value = 1; }; template<unsigned int Pos> bool is_bit_set(unsigned int value) { return (value & pow_2<Pos>::value) != 0; } bool result = is_bit_set<2>(value);
是的,我知道我不会这样做。 但我通常写道:
/* Return type (8/16/32/64 int size) is specified by argument size. */ template<class TYPE> inline TYPE BIT(const TYPE & x) { return TYPE(1) << x; } template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y) { return 0 != (x & y); }
例如:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
除此之外,这种方法:
- 容纳8/16/32/64位整数。
- 检测IsBitSet(int32,int64)调用不知情和同意。
- 内嵌模板,所以没有函数调用开销。
- 常量&引用,所以没有需要被复制/复制。 而且我们保证编译器会收到任何试图改变参数的拼写错误。
- 0!=使代码更清晰明了。 编写代码的主要目的是始终与其他程序员(包括那些技能较差的程序员)进行清晰而有效的交stream。
- 虽然不适用于这种特殊情况…一般来说,模板化函数避免了多次评估参数的问题。 一些#definemacros的已知问题。
例如:#define ABS(X)(((X)<0)? – (X):( X))
ABS(I ++);
根据这个比特字段的描述,直接定义和访问字段是一种方法。 这个入口的例子是:
struct preferences { unsigned int likes_ice_cream : 1; unsigned int plays_golf : 1; unsigned int watches_tv : 1; unsigned int reads_books : 1; }; struct preferences fred; fred.likes_ice_cream = 1; fred.plays_golf = 1; fred.watches_tv = 1; fred.reads_books = 0; if (fred.likes_ice_cream == 1) /* ... */
此外,还有一个警告:
但是,结构中的位成员有实际的缺点。 首先,内存中的位的顺序取决于体系结构,内存填充规则因编译器而异。 另外,许多stream行的编译器生成用于读和写位成员的低效率代码,并且由于大多数机器不能操纵存储器中的任意位集,所以与位字段(特别是在多处理器系统中)有潜在的严重的线程安全问题,但是必须加载并存储整个单词。
select的答案在做什么实际上是错误的。 下面的函数将返回位的位置或0,这取决于该位是否被实际使能。 这不是海报所要求的。
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
这是海报最初寻找的东西。 如果该位被启用,下面的函数将返回1或0,而不是位置。
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
您可以使用Bitset – http://www.cppreference.com/wiki/stl/bitset/start 。
有,就是_bittest内在的指令。
我试图读取一个32位整数,它定义了PDF中的对象的标志,这不适合我
什么修正了它正在改变的定义:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
操作数&返回一个整数与标志,都在1,它不是正确的转换成布尔值,这就做了伎俩
使用std :: bitset
#include <bitset> #include <iostream> int main() { int temp = 0x5E; std::bitset<sizeof(int)*CHAR_BITS> bits(temp); // 0 -> bit 1 // 2 -> bit 3 std::cout << bits[2] << std::endl; }
你可以“模拟”移动和屏蔽:if((0x5e /(2 * 2 * 2))%2)…
对于低级x86特定解决scheme,请使用x86 TEST操作码。
你的编译器应该把_bittest变成这个,但…
为什么不使用这样简单的东西?
uint8_t status = 255; cout << "binary: "; for (int i=((sizeof(status)*8)-1); i>-1; i--) { if ((status & (1 << i))) { cout << "1"; } else { cout << "0"; } }
输出:二进制: 11111111
如果你只是想要一个真正的硬编码的方式:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
注意这个hw依赖,并假定这个位顺序7654 3210和var是8位。
#include "stdafx.h" #define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 ) int _tmain(int argc, _TCHAR* argv[]) { int temp =0x5E; printf(" %d \n", IS_BIT3_SET(temp)); temp = 0x00; printf(" %d \n", IS_BIT3_SET(temp)); temp = 0x04; printf(" %d \n", IS_BIT3_SET(temp)); temp = 0xfb; printf(" %d \n", IS_BIT3_SET(temp)); scanf("waitng %d",&temp); return 0; }
结果是:
1 0 1 0
虽然现在回答的时间已经相当晚了,但是如果只设置了第N位,只需使用POWER和MODULUSmath运算符就可以find一个简单的方法。
让我们说,我们想知道'temp'是否有第N位设置。 如果设置了位,下面的布尔expression式将为真,否则为0。
- (临时模块2 ^ N + 1> = 2 ^ N)
考虑下面的例子:
- int temp = 0x5E; //二进制0b1011110 // BIT 0是LSB
如果我想知道第三位是否设置,我得到
- (94 MODULUS 16)= 14> 2 ^ 3
所以expression式返回true,表示第3位被设置。
一种方法是在以下情况下检查:
if ( (mask >> bit ) & 1)
解释程序将是:
#include <stdio.h> unsigned int bitCheck(unsigned int mask, int pin); int main(void){ unsigned int mask = 6; // 6 = 0110 int pin0 = 0; int pin1 = 1; int pin2 = 2; int pin3 = 3; unsigned int bit0= bitCheck( mask, pin0); unsigned int bit1= bitCheck( mask, pin1); unsigned int bit2= bitCheck( mask, pin2); unsigned int bit3= bitCheck( mask, pin3); printf("Mask = %d ==>> 0110\n", mask); if ( bit0 == 1 ){ printf("Pin %d is Set\n", pin0); }else{ printf("Pin %d is not Set\n", pin0); } if ( bit1 == 1 ){ printf("Pin %d is Set\n", pin1); }else{ printf("Pin %d is not Set\n", pin1); } if ( bit2 == 1 ){ printf("Pin %d is Set\n", pin2); }else{ printf("Pin %d is not Set\n", pin2); } if ( bit3 == 1 ){ printf("Pin %d is Set\n", pin3); }else{ printf("Pin %d is not Set\n", pin3); } } unsigned int bitCheck(unsigned int mask, int bit){ if ( (mask >> bit ) & 1){ return 1; }else{ return 0; } }
输出:
Mask = 6 ==>> 0110 Pin 0 is not Set Pin 1 is Set Pin 2 is Set Pin 3 is not Set
最快的方式似乎是一个面具查找表