#ifndef __BIT_H__
#define __BIT_H__
#include <stdint.h>
/*
*********************************************************************************************************
* 程序配置
*********************************************************************************************************
*/
#define BIT_STAT_EN 0 ///< 位统计编译允许
#define BIT_MAP16_EN 0 ///< 位图数据设置编译允许
#define BIT_REV8_EN 1 ///< 位反转编译允计
/*
*********************************************************************************************************
* 常用位操作宏
*********************************************************************************************************
*/
#define B_V(BIT) (1 << (BIT)) ///< 将指定位置1
#define B_SET(LVALUE, BIT) (LVALUE |= 1 << (BIT)) ///< 位置1,直接操作指定的位
#define B_CLR(LVALUE, BIT) (LVALUE &= ~(1 << (BIT))) ///< 位清0,直接操作指定的位
#define B_REV(LVALUE, BIT) (LVALUE ^= 1 << (BIT)) ///< 位取反,直接操作指定的位
#define B_SET_MSK(LVALUE, MASK) (LVALUE |= (MASK)) ///< 位置1,操作MASK指定的位,可以多位
#define B_CLR_MSK(LVALUE, MASK) (LVALUE &= ~(MASK)) ///< 位清0,操作MASK指定的位,可以多位
#define B_REV_MSK(LVALUE, MASK) (LVALUE ^= (MASK)) ///< 位取反,操作MASK指定的位,可以多位
#define B_CHK(OPERAND, BIT) ((OPERAND) & 1 << (BIT)) ///< 位检测
#define B_CHK_MSK(OPERAND, MASK) ((OPERAND) & (MASK)) ///< 位检测,检测MASK指定的位,可以多位
/** \brief 设置指定位的值
*
* \param LVALUE 合法的左值表达式,常用为整型变量
* \param BIT 要设置的位,根据LVALUE的类型,不能超过其位数的最大值,如LVALUE为32位整型,就不能超过31
* \param VALUE 要设置的值,当VALUE为0时,设置相应位的值为0,当VALUE为其它值时,设置相应位的值为1
*/
#define B_SET_BIT(LVALUE, BIT, VALUE) ((VALUE) ? B_SET(LVALUE, (BIT)) : B_CLR(LVALUE, (BIT)))
/** \brief 位图位设置
*
* 以位图方式设置某位的值,值为0置相应位为0,其它值置1
* \param MAP uint16_t指针
* \param LOC 要设置的位
* \param VALUE 要设置值,0-0,其它-1
*
* \warning 此宏不检查MAP指针缓冲的边界,LOC设置不当,会造成指针溢出,导致意想不到的后果
*/
#define MAP_BIT16_SET(MAP, LOC, VALUE) BIT_SET_BIT(MAP[(LOC) / 16], (LOC) % 16, (VALUE))
/** \brief 位图位检查
*
* 以位图方式检查某位的值,单字的位长度为16位。
* \param MAP uint16_t指针
* \param LOC 要检查的位
* \return 检查结果
* \retval 0 LOC对应位为0
* \retval 其它 LOC对应位为1
*
* \warning 此宏不检查MAP指针缓冲的边界,LOC设置不当,会造成指针溢出,导致意想不到的后果
*/
#define MAP_BIT16_CHK(MAP, LOC) (MAP[(LOC) / 16] & (1 << (LOC) % 16)) |