如何构建用于低级别位掩码的C宏?

时间:2014-07-09 19:25:51

标签: c macros embedded bit-manipulation

我开始学习编程嵌入式C微控制器,并希望做一些让我的生活更轻松的事情。通常在处理位屏蔽时,每个人都会使用以下内容:

char a = (1 << 3) | (1 << 1) | (1 << 5);

我想使用宏来做这样的事情。对于一个掩码,我可以简单地定义这个宏:

#define M(n) (1 << (n))

没什么特别的。问题是我无法找到一个允许我输入的好解决方案:

a = MM( 3, 1, 5 );或至少a = MM( 3, 3, 1, 5 );(其中第一个3是参数的数量)

而不是a = M(3) | M(1) | M(5);

我提出了一个解决方案,暗示使用具有多个参数的函数,但它真的让我烦恼,我不能使用宏来做它。

3 个答案:

答案 0 :(得分:2)

找到答案。

#define M(a)        (1 << (a))
#define M2(a, b)    (M(a) | M(b))
#define M3(a, b...) (M(a) | M2(b))
#define M4(a, b...) (M(a) | M3(b))
// can be continued

#define GET_MACRO( _1, _2, _3, _4, NAME, ... ) NAME
#define MM(args...) GET_MACRO( args, M4, M3, M2, M )(args)

这使用了this thread

中的答案

答案 1 :(得分:1)

也许这会有所帮助:

#define BITMASK_SET(x,y) ((x) |= (y))
#define BITMASK_CLEAR(x,y) ((x) &= (~(y)))
#define BITMASK_FLIP(x,y) ((x) ^= (y))
#define BITMASK_CHECK(x,y) ((x) & (y))

答案 2 :(得分:0)

使用boost

#include <boost/preprocessor/tuple/to_seq.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/control/if.hpp>

#define M(n) (1 << (n))
#define F(r, data, i, elem) BOOST_PP_IF(i, data, ) M(elem)
#define MM(...) BOOST_PP_SEQ_FOR_EACH_I(F, | , BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)) )

...
char a = MM(3, 1, 5);//char a = (1 << (3)) | (1 << (1)) | (1 << (5)) ;