从字节读取“ N”位

时间:2018-11-14 13:17:07

标签: c mplab

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

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

如何从缓冲区读取n位。是0还是1? 例如,从字节开始的7位是0还是1

6 个答案:

答案 0 :(得分:7)

您必须精确定义位数:

  • 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));
}

答案 1 :(得分:2)

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

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

然后在if子句中使用它。

请注意“ !! ”运算符,以确保其返回0或1。

答案 2 :(得分: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。

答案 3 :(得分:0)

当然,您必须预先定义您的钻头位置。

例如
Bit7(MSB)
Bit0(LSB)

测试第7位:

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

答案 4 :(得分:0)

您可以仅使用此函数传递char和N(位数)。该函数将按位调用AND滤除您需要检查的位。

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

答案 5 :(得分:0)

这里是一个从 x 中得到 n 位的函数

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