在嵌入式开发的过程中,需要经常用到一些位操作,比如设置字节的某个位的值,设置字节的某几个位的值等,可以将这些操作定义为一些宏定义,方便调用。
1. setBitValue
功能:设置字节的某个位的值为0或者为1。
宏定义:#define setBitValue(x,k,value) (x) = ( (value>0) ?((x) | (1<<((k)-0)) : ((x) & ~(1<<((k)-0)))
x ----- 字节
k -----设置字节的第几位,从0开始,0,1,2,3,4,5,6,7分别对应字节的1,2,3,4,5,6,7,8位
value --0 或者1,
2. getBitValue
功能:获取字节的某个位的值
宏定义:#define getBitValue(x,k,value) (value) = ((x>>((k)-0)) & 1)
x ---- 字节值
k ----字节的第几位,从0开始,0,1,2,3,4,5,6,7分别对应字节的1,2,3,4,5,6,7,8位
value --获取的字节的某位的值
3. clearBitMap
功能:将字节的fromBit位到toBit位清零
宏定义:#define clearBitMap(var,fromBit,toBit) (var) = ((var) & ~(((0x1<<((toBit)+1-(fromBit)))-1)<< (fromBit)))
fromBit, toBit, 设置的起始位,结束位,从0开始,0,1,2,3,4,5,6,7分别对应字节的1,2,3,4,5,6, 7,8位
var ---被清楚某些位的值
4. setBitMap
功能:将字节的fromBit位到toBit位设置为value
宏定义:#define setBitMap(var,fromBit,toBit,val) (var) = ((var) & ~(((0x1<<((toBit)+1-(fromBit)))-1)<< (fromBit))) | ((val) << (fromBit + 0))
fromBit, toBit, 设置的起始位,结束位,从0开始,0,1,2,3,4,5,6,7分别对应字节的1,2,3,4,5,6, 7,8位
var ---需要设置的字节
val --- 需要设置的值
5.cmpBitValue(a,b,bit)
功能:比较字节a和字节b的bit位的值是否相同,相同则为0,不同则为1
宏定义:#define cmpBitValue(a,b,bit) ((((a)>>bit) & 0x01) == (((b)>>bit) & 0x01) ?0:1)
a,b---需要比较的两个字节
bit----需要比较的字节位,从0开始,0,1,2,3,4,5,6,7分别对应字节的1,2,3,4,5,6, 7,8位
6.getBitMap(a,fromBit,toBit,b)
功能:获取字节a的fromBit到toBit位的值
宏定义:#define getBitValue(a,fromBit,toBit,b) ((b) = (((a)>> (frombit)) & ( (0x01) << ((toBit) + (fromBit) - 1))))
a---需要获取数据的原字节
b---获取的数据存储在b中
fromBit,toBit---开始bit位和结束bit位,bit从0开始
7. cmpBitMap(a,b,fromBit,toBit)
功能:比较字节a和字节b从fromBit到toBit之间的位是否相等。相等返回0,不相等返回1
宏定义:#define cmpBitMap(a,b,fromBit,toBit) ((((a) >>(fromBit)) &((1 <<((toBit)-(fromBit)+1)) -1)) ^ (((b) >>(fromBit)) &((1 <<((toBit)-(fromBit)+1)) -1))) //bit从0开始
a,b----比较的字节
fromBit,toBit,比较的起始位和结束位,bit0开始。