高手解释一下arm公司给出的置位操作函数(C语言代码)

如题
代码如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);
}
void SET_BITS(int __dst,
int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) |
\
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS,ReGISterNumber);

方法D:

#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)))
| \
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);

bwXXXX是你需要设置的那个数的位数
bsXXXX是你需要设置的数需要左移的位数

比方说现在有一个数是0x12345678;
你想把8-11位设置为3,那么
bw就是4(8-11是4位数)
bs就是8,因为是从bit8开始,所以要左移8位

#define bwTEST 4
#define bsTEST 8

那么
INT i=0x12345678;
SET_BITS(i, TEST, 3);
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-08-05
位操作你需要懂二进制。而且还需要知道从二进制转到16进制或者10进制的算法,然后你需要一个一个来算出来才能知道是怎么样运算的,我看见二进制就头疼,也不会,不好意思了

arm体系如何对SWI功能
ARM体系中的SWI指软件中断指令。通过SWI指令可以在用户态(用户程序运行时)触发一个软中断,将处理器从用户态切换到内核态并执行内核中指定的处理程序来完成期望的操作。SWI指令在ARM体系的指令系统中是一个专门的指令,其具体实现方式会根据具体的处理器架构和操作系统环境而有所不同。一般来说,SWI指令...

如何提取BIOS固件中的代码
最后还要注意,当有新的处理函数加入到分配表中之后,保存在SMRAM数据段中的SMI代码计数值也要相应的加1,保持SMI处理函数数目的一致性。 上述这个“调试”处理函数只做了一件事情,就是将SMI分配表从0x0B428:[si]拷贝到0x07000:[di]的位置,看来我们可以放心大胆的用自己的SMI代码钩挂它了。随后,我们将实现一个...

如何优化C++程序代码编写
bs ## __bf))& (BIT_MASK(__bf)))SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);D方法是我看到的最好的置位操作函数,是arm公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。第三招:数学方法解决问题 现在我们演绎...

cpu用什么方法在向量表中寻找中断向量?
1、在UART0_ini(uint32 baud,UARTMODE set)函数中有一语句为if(set.parity>4) return(0);set.parity是奇偶校验位,这里为什么是大于4,其值范围为0到3,我觉的应该是if(set.parity>3) return(0); 2、还是在这个程序中,多次出现像if(0x04 == (U0IIR & 0x0F));为什么要这样写,而不是if((U0IIR & ...

相似回答