/*++++
功能:用位运算反转一个字节
参数: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;
}
}