从一个字节中读取 'N' 位

Read 'N' bit from a byte

我需要从一个字节中读取特定位。我要测试的值是 0 或 1。

unsigned char Buffer[0]=2; 
//or binary 0b00000010

如何从缓冲区读取 n 位。如果它是 0 或 1? 例如,如果来自字节的 7 位是 0 或 1

您必须准确定义如何计算位数:

  • 01
  • 开始
  • 从最不重要到最重要还是相反?

假设位 0 是最不重要的,你可以用这个表达式得到位 7

int bit7 = ((unsigned char)Buffer[0] >> 7) & 1;

这是一个通用循环:

for (int i = 7; i >= 0; i--) {
    putchar('0' + (((unsigned char)Buffer[0] >> i) & 1));
}

当然你得提前定义你的位位置

例如
位 7(最高位)
Bit0 (LSB)

测试第 7 位:

if (Buffer[0] & 0x80)
{
    //do action for bit 7 = 1
}
else
{
    // do action for bit7 = 0
}

您可以只使用此函数来传递您的 char 和 N(位数)。该函数将按位调用并过滤掉您需要检查的位。

bool check_N_bit(char a_char , int N)
{
    if (N>8)
    {
        return false;
    }
    if ((a_char&(0x01 << N-1)) > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

要检查位是 0 还是 1,您可以定义一个简单的宏,例如:

#define BIT_ISSET(var, pos) (!!((var) & (1ULL<<(pos))))

然后在 if 子句中使用它。

注意'!!'运算符,以确保它returns 0 或 1。

回答你的问题:这将检查第 7 位的值。

unsigned char Buffer = 2; //Hope this is what you are looking for 

if (((Buffer >> 7) & 0x01) == 1 )
{
    printf(" Bit is 1 ");
} 
else
{
    printf(" Bit is 0 ");
}

类似的方法,如果你需要检查第n位的值,将if条件中的7替换为n。

这里是一个从 x 中获取位 n 的函数

int getBit(unsigned int x, int n){
    return (x >> (n-1)) & 0x01;
}