用位运算反转一个字节

/*++++
  功能:用位运算反转一个字节
  参数:INT8U c           一字节
  输出:反转的字节
  例子:1000 0000 → 0000 0001
----*/
typedef unsigned char    INT8U;                    /* Unsigned  8 bit quantity                           */
INT8U reverse8( INT8U c )
{
    
    
     c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
     c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
     c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
     return c;
}
/*++++
  功能:检查位串的某个位置是1或0
  参数:INT8U *BS           位串
       INT8U bitStringLen  位串字节长度
       int  bitpos                第?位     0:代表bit0 
  描述:bit0-bit7  顺序0-7
 
----*/
INT8U get_bit_value(INT8U *BS,INT16U bitStringlen,INT16U bitpos)
{
    
    
    INT8U  byte_no;
    if(bitpos > 7)
    {
    
    
        byte_no = bitpos >> 3;
        BS += byte_no;
        if(bitStringlen <= byte_no) return 0;
        //bitStringlen-=byte_no;
        bitpos &= 0x07;
    }
    return (*BS) & (BITSTRING_MASK<<bitpos);
}

例子:if(get_bit_value(&smoke_alarm_state,1,7-idx))中if括号里面的函数结果如果不是零就表示smoke_alarm_state的这一位是1

for(idx=0;idx<=Max_TCBUS_dev_count;idx++)
{
    
    
	if(tcbus_online[idx].dev_type==1)//烟雾传感器
	{
    
    
	    resp[pos++] = DT_ENUM;
	    if(get_bit_value(&smoke_alarm_state,1,7-idx))
	        resp[pos++] = 1; 
	    else
	        resp[pos++] = 0;        
	}
}

猜你喜欢

转载自blog.csdn.net/luopeng12345/article/details/109902375