#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK
(MCDR2_ADDRESS)
#define BIT_MASK(_bf)(((1U<<(bw##_bf))-1)<<(bs##_bf)
#define SET_BITS(_dst,_bf,_val)\
((_dst)=((_dst)&~(BIT_MASK(_bf)))I(((_val)<<(bs##_bf))&(BIT_MASK(_bf))))
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumber);
他是实现什么功能啊?怎么实现的?我知道他就是一堆宏定义,来回替换,但是看不懂他移位什么的,是实现什么功能啊 ?能写具体点吗?
追答#define bwMCDR2_ADDRESS 4 // 这里的MCDR2_ADDRESS是可以自己定义的,
// 后面的数字代表
//宽度
#define bsMCDR2_ADDRESS 17 //同上, 数字代表开始的位数;
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(_bf)(((1U<<(bw##_bf))-1)<<(bs##_bf)
//上面的两句不太会解释:
//假如宽度就是4, 位数是17
//上面两句话就是得到一个数(二进制)1 1110 0000 0000 0000 0000
#define SET_BITS(_dst,_bf,_val)\((_dst)=((_dst)&~(BIT_MASK(_bf)))I(((_val)<<(bs##_bf))&(BIT_MASK(_bf))))
//如果上面三句都理解了, 那么这就简单了, 假如_dst 的值为1 1010 1010 1010 1010,
//_val的值为0101; 那么你带入就能得到后来_dst的值变为 (0101)0 1010 1010 1010;
//我把前面部分括起来了, 因为那是_val的值; 可能就是这样吧.
哪里有错还请原谅;
这是c语言。