C++ C/C++;检查是否设置了一位,即int变量

C++ C/C++;检查是否设置了一位,即int变量,c++,c,bit-manipulation,C++,C,Bit Manipulation,有没有这样一种方法可以检查temp中的位3是1还是0,而不需要位移位和掩蔽 只是想知道是否有一些内置函数用于此,或者我是被迫自己编写的。您可以使用位集-。检查是否设置了位N(从0开始): temp&(1在C中,如果要隐藏位操作,可以编写宏: temp & (1 << N) 在C++中,你可以使用.< /p> < p>你可以“模拟”转换和掩蔽:如果((0x5e/(2×2×2)%)2……有,即内在指令。< /p> ,有一种直接定义和访问字段的方法。 CHECK_BIT(temp

有没有这样一种方法可以检查temp中的位3是1还是0,而不需要位移位和掩蔽

只是想知道是否有一些内置函数用于此,或者我是被迫自己编写的。

您可以使用位集-。

检查是否设置了位N(从0开始):


temp&(1在C中,如果要隐藏位操作,可以编写宏:

temp & (1 << N)
在C++中,你可以使用.< /p> < p>你可以“模拟”转换和掩蔽:如果((0x5e/(2×2×2)%)2……

有,即内在指令。< /p> ,有一种直接定义和访问字段的方法。
CHECK_BIT(temp, n - 1)
此外,还有一个警告:

然而,结构中的位成员有实际的缺点。首先,内存中位的顺序取决于体系结构,内存填充规则因编译器而异。此外,许多流行的编译器生成低效的代码来读取和写入位成员,并且存在与此相关的潜在严重线程安全问题位字段(特别是在多处理器系统上),这是因为大多数计算机无法处理内存中的任意位集,而必须加载和存储整个字


如果您只是想要一种真正的硬编码方式:

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)
    /* ... */
注意此hw相关,并假设此位顺序为7654 3210,var为8位

 #define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
结果:

一, 0 1.
0

是的,我知道我“没有”这样做。但我通常写:

#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;
}
除其他外,这种方法:

  • 容纳8/16/32/64位整数
  • 在我不知情和不同意的情况下检测IsBitSet(int32、int64)调用
  • 内联模板,因此没有函数调用开销
  • 常量&引用,因此没有任何需要复制/复制。并且我们保证编译器将拾取任何试图更改参数的打字错误
  • 0!=使代码更加清晰明了。编写代码的主要目的始终是与其他程序员(包括技能较低的程序员)进行清晰高效的沟通

  • 虽然不适用于这个特殊的情况…一般来说,模板函数避免了多次计算参数的问题。一个已知的问题,一些C++定义宏。
    IsBitSet( foo, BIT(3) | BIT(6) );  // Checks if Bit 3 OR 6 is set.
    
    typedef std::位集IntBits;
    bool is_set=int位(值)。测试(位置);
    
    或者这种愚蠢又如何

    typedef std::bitset<sizeof(int)> IntBits;
    bool is_set = IntBits(value).test(position);
    
    模板
    结构动力2{
    静态常量unsigned int value=2*pow_2::value;
    };
    模板
    结构动力2{
    静态常量无符号整数值=1;
    };
    模板
    布尔是位集合(无符号整数值)
    {
    返回值(值和功率2::值)!=0;
    } 
    bool result=is_bit_set(值);
    
    使用std::位集

    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);
    
    #包括
    #包括
    int main()
    {
    int-temp=0x5E;
    std::位集位(temp);
    //0->第1位
    //2->第3位
    
    std::cout对于低级别的x86特定解决方案,请使用x86操作码


    您的编译器应该会变成这样…

    最快的方法似乎是掩码的查找表

    我试图读取一个32位整数,它定义了PDF中对象的标志,但这对我不起作用

    修正了它正在更改定义的问题:

    #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;
    }
    

    #定义校验位(var,pos)((var&(1)虽然现在回答已经很晚了,但有一种简单的方法可以找到是否设置了第n位,只需使用幂和模数学运算符即可

    假设我们想知道“temp”是否设置了第n位。如果设置了第n位,下面的布尔表达式将为true,否则为0

    • (温度模数2^N+1>=2^N)
    考虑以下示例:

    • int temp=0x5E;//二进制0b1011110//位0为LSB
    如果我想知道是否设置了第三位,我得到

    • (94模数16)=14>2^3

    所以表达式返回true,表示设置了第三位。

    为什么不使用这样简单的方法呢

    #define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
    
    uint8\u t status=255;
    cout-1;我--)
    {
    
    if((status&(1)所选答案实际上是错误的。下面的函数将返回位位置或0,具体取决于位是否实际启用。这不是海报所要求的

    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";
      }
    }
    

    一种方法是在以下条件下进行检查:

    #define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
    
    解释程序将包括:

    if ( (mask >> bit ) & 1)
    
    我用这个:

    Mask = 6 ==>>  0110
    Pin 0 is not Set
    Pin 1 is Set
    Pin 2 is Set
    Pin 3 is not Set
    
    其中“pos”定义为2^n(例如1,2,4,8,16,32…)

    返回: 1如果为真 如果为false,则为0

    LATGbits.LATG0=((m&0x8)>0);//检查m的第2位是否为1

    #define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
    
    pos—从0开始的位位置


    返回0或1。

    为什么要进行所有这些位移位操作并需要库函数?如果您有OP发布的值:1011110,并且您想知道是否设置了右侧第三个位置的位,只需执行以下操作:

    #define CHECK_BIT(var,pos) ((var>>pos) & 1)
    
    或者,代码的未来读者可能更容易理解一些东西,而不需要包括:

    int temp = 0b1011110;
    if( temp & 4 )   /* or (temp & 0b0100) if that's how you roll */
      DoSomething();
    
    或者如果你想让它看起来更漂亮一点:

    int temp = 0b1011110;
    _Bool bThirdBitIsSet = (temp & 4) ? 1 : 0;
    if( bThirdBitIsSet )
      DoSomething();
    
    #包括
    内部温度=0b1011110;
    boolbthirdbitisset=(温度&4)?真:假;
    如果(b第三个比特集)
    DoSomething();
    
    先前的答案向您展示了如何处理位检查,但更多情况下,它都是关于编码在整数中的标志,在任何先前的案例中都没有很好的定义

    在典型场景中,标志本身定义为整数,其引用的特定位为1。在下面的示例中,您可以检查该整数是否具有标志列表中的任何标志(串联多个错误标志),或者每个标志是否都在该整数中(串联多个成功标志)

    下面是一个如何处理整数中标志的示例

    此处提供的实例:

    //g++7.4.0
    #包括
    #包括
    内联布尔任意标志存在(无符号整数
    
    Mask = 6 ==>>  0110
    Pin 0 is not Set
    Pin 1 is Set
    Pin 2 is Set
    Pin 3 is not Set
    
    #define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
    
    #define CHECK_BIT(var,pos) ((var>>pos) & 1)
    
    int temp = 0b1011110;
    if( temp & 4 )   /* or (temp & 0b0100) if that's how you roll */
      DoSomething();
    
    int temp = 0b1011110;
    _Bool bThirdBitIsSet = (temp & 4) ? 1 : 0;
    if( bThirdBitIsSet )
      DoSomething();
    
    #include <stdbool.h>
    int temp = 0b1011110;
    bool bThirdBitIsSet = (temp & 4) ? true : false;
    if( bThirdBitIsSet )
      DoSomething();
    
    #define get_bit_status()    ( YOUR_VAR  &   ( 1 << BITX ) )
    
    .
    .
    
    if (get_rx_pin_status() == ( 1 << BITX ))
    {
        do();
    }