Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从字节中读取“N”位_C_Mplab - Fatal编程技术网

C 从字节中读取“N”位

C 从字节中读取“N”位,c,mplab,C,Mplab,我需要从一个字节中读取一个特定的位。我要测试的值是0或1 unsigned char Buffer[0]=2; //or binary 0b00000010 如何从缓冲区读取n位。如果是0或1? 示例:如果字节的7位为0或1,则必须精确定义如何计算位: 从0或1开始 从最不重要到最重要,还是相反? 假设位0是最低有效位,则可以使用以下表达式获得位7: int bit7 = ((unsigned char)Buffer[0] >> 7) & 1; 下面是一个通用循环: f

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

unsigned char Buffer[0]=2; 
//or binary 0b00000010
如何从缓冲区读取n位。如果是0或1?
示例:如果字节的7位为0或1,则必须精确定义如何计算位:

从0或1开始 从最不重要到最重要,还是相反? 假设位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));
}

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

从0或1开始 从最不重要到最重要,还是相反? 假设位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));
}

当然,你必须事先确定你的钻头位置

e、 g。 位7 MSB 比特0 LSB

位7的测试:

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

当然,你必须事先确定你的钻头位置

e、 g。 位7 MSB 比特0 LSB

位7的测试:

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

您可以使用此函数传递char和nnnumber位。此函数将按位调用并过滤掉需要检查的位

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

您可以使用此函数传递char和nnnumber位。此函数将按位调用并过滤掉需要检查的位

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子句中使用它


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

要检查位是否为0或1,可以定义一个简单的宏,如:

#define BIT_ISSET(var, pos) (!!((var) & (1ULL<<(pos))))
然后在if子句中使用它


注意“!!”运算符,以确保它返回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。回答您的问题:这将检查第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。

首先,要创建一个零元素数组,并在其中存储一个值吗?这不太好用。字符缓冲区[0]=2;他身体不好。它将2分配给长度为0的数组。我相信,即使是长度为0的数组也是病态的。至于你的问题,你不能真正读取位。您可以使用从字节中屏蔽出所需的位。通常,为了测试单个位,C有位运算符。示例:.@Scheff是,大小为0的数组是非法的。这是故意导致编译时错误的经典方法之一。首先,您想创建一个零元素数组,并在其中存储一个值吗?这不太好用。字符缓冲区[0]=2;他身体不好。它将2分配给长度为0的数组。我相信,即使是长度为0的数组也是病态的。至于你的问题,你不能真正读取位。您可以使用从字节中屏蔽出所需的位。通常,为了测试单个位,C有位运算符。示例:.@Scheff是,大小为0的数组是非法的。这是故意导致编译时错误的经典方法之一。非常感谢您提供的示例,我尝试了这个方法,但它没有显示数字是1。int bit7=无符号字符缓冲区[0]>>7&1;ifbit7==1//code@ddd是的。到底是什么问题?@ddd检查,例如:include int main{//bit 7:| | | | | | |//binary:0000 0000 0000 1000 0000 0111 0000 1010 0000 0111 1001无符号字符缓冲区[]={0x0,0x80,0x70,0xa0,0x79};forsize_t i=0;sizeofbuffer>i;++i{printf%u%i\n,缓冲区[i],无符号字符缓冲区[i]>>7&1;}。它符合你的要求,不是吗?@ddd我想你在例子0b00000010中将1编号为第7位,这不是任何人都会承认的惯例。用这种表示法,人们通常从0开始从右到左计数。如果你想提取那个位,你可以使用unsignedcharbuffer[0]>>1&1非常感谢你的例子,我尝试了这个,但它没有显示数字是1。int bit7=无符号字符缓冲区[0]>>7&1;ifbit7==1//code@ddd是的。到底是什么问题?@ddd检查,例如:include int main{//bit 7:| | | | | | |//binary:0000 0000 0000 1000 0000 0111 0000 1010 0000 0111 1001无符号字符缓冲区[]={0x0,0x80,0x70,0xa0,0x79};forsize_t i=0;sizeofbuffer>i;++i{printf%u%i\n,缓冲区[i],无符号字符缓冲区[i]>>7&1;}。它符合你的要求,不是吗?@ddd我想你在例子0b00000010中将1编号为第7位,这不是任何人都会承认的惯例。用这种表示法,人们通常从0开始从右到左计数。如果你想提取那个位,你可以使用unsigned charBuffer[0]>>1&1,我不知道为什么,但它不会返回1:bit count 0…7,但我想这不是问题所在,我认为ddd和S

wordfish都对位的编号约定感到困惑。FYI编号从右侧的零开始。数字2设置了位1,而不是位7。第7位相当于128位。看起来我从42位倒计时。没关系,我说的是废话;我不知道为什么,但它不会返回1:Bit count 0…7,但我想这不是问题所在。我认为ddd和箭鱼都对比特数的约定感到困惑。FYI编号从右侧的零开始。数字2设置了位1,而不是位7。第7位相当于128位。看起来我从42位倒计时。没关系,我说的是废话;您使用的是pow2,N-1而不是1是的,我没有移位。我只是初始化一个字符。我也可以使用0x01并将其移位N个字节,您是对的,只是不同的方法。您知道移位会快得多吗?更少的代码,更少的时间。是的,我确实修复了它。很好的捕获!你用的是pow2,N-1而不是1是的,我没有移位。我只是初始化一个字符。我也可以用0x01并将其移位N个字节,你是对的,只是不同的方法。你知道移位会快得多吗?更少的代码,更少的时间。是的,我确实修复了它。很好的捕获!你差一点