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) 

有,就是_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 

最快的方式似乎是一个面具查找表