本帖最后由 ccxlslr 于 2013-1-28 13:36 编辑
#define BIT_SET(LVALUE, BIT) (LVALUE |= 1 << (BIT)) /* 位置1,直接操作指定的位 */
#define BIT_CLR(LVALUE, BIT) (LVALUE &= ~(1 << (BIT))) /* 位清0,直接操作指定的位 */
#define BIT_REV(LVALUE, BIT) (LVALUE ^= 1 << (BIT)) /* 位取反,直接操作指定的位 */
#define BIT_SET_MSK(LVALUE, MASK) (LVALUE |= (MASK)) /* 位置1,操作MASK指定的位,可以多位 */
#define BIT_CLR_MSK(LVALUE, MASK) (LVALUE &= ~(MASK)) /* 位清0,操作MASK指定的位,可以多位 */
#define BIT_REV_MSK(LVALUE, MASK) (LVALUE ^= (MASK)) /* 位取反,操作MASK指定的位,可以多位*/
#define BIT_CHK(OPERAND, BIT) ((OPERAND) & 1 << (BIT)) /* 位检测 */
#define BIT_CHK_MSK(OPERAND, BIT) ((OPERAND) & (MASK)) /* 位检测,检测MASK指定的位,可以多位*/
#define BIT_SET_BIT(LVALUE, BIT, VALUE) ((VALUE) ? BIT_SET(LVALUE, (BIT)) : BIT_CLR(LVALUE, (BIT))) /* */
/* 设置指定位的值 */
unsigned char bitdata[10] //可以定义80个位
unsigned char bitpt = 0; //类似指针
unsigned char x,y//
比如找第28个位
bitpt = 28;
y = bitpt / 8
x = bitpt % 8;
if (BIT_CHK(bitdata[ y], x) {
//位为1执行
}
设置的话用BIT_SET , 清零用BIT_CLR, 可以将上面的宏展开。
可以通过运算bitpt来查找需要的位 |