c语言一个宏定义

来源:百度知道 编辑:UC知道 时间:2024/06/17 14:06:30
#define HLJ_Set8bitState(s1, s2, s3) (s1 = ( ( s1 & ~(0xff<<s2) ) | (s3<<s2) ))
#define HLJ_Read8bitState(s1, s2) ( (s1 & (0xff<<s2) )>>s2 )

这2个宏具体代表是什么含义?

第一个宏: 将s3放置于s1中的s2位开始的地方。

(A) ~(0xff<<s2)0xff左移s2位然后取反。若s2为4则结果为 ~0xff0则0xff0中1所在的位置会变为0.其他位为1.
(B) s1 & ~(0xff<<s2)即将s1中的相对应于(A)中0xff所在位置的位清零。
(C)s3<<s2 S3左移S2位。
(D)s1 = ( ( s1 & ~(0xff<<s2) ) | (s3<<s2) )即 0xff左移s2位,然后将那0xff左移后,1所对应的位清零。其他位置1.然后与上s1,即完成把s1中相对应的位清零。然后将s3左移s2位或上之前的结果。即实现将s3放置于s1中的s2位开始的地址。

第二个宏: 即 将s1中的s2位开始的8位取出。
(A)s1&(0xff<<s2)取出s1中s2位开始的8位数据。
(B) (s1 & (0xff<<s2) )>>s2 将这几位数据变成一个没有偏移的量。即那8位数据它真实的值。

在你的程序里面只要出现HLJ_Set8bitState(s1, s2, s3) 就用(s1 = ( ( s1 & ~(0xff<<s2) ) | (s3<<s2) ))替换 下面的同理