编写C宏

时间:2010-04-15 10:13:05

标签: c macros

我必须编写一个宏作为参数获取一些变量,并且对于每个带有“1”值的两个连续位,将其替换为0位。

例如:10110100将变为10000100 并且,11110000-> 00000000
11100000->亿

我在编写宏时遇到了麻烦。我已经尝试编写一个宏来获取wach位并替换它,如果下一位是相同的(并且它们都是1),但它只适用于8位并且它非常不友好......

P.S。我需要一个宏,因为我正在学习C,这是我发现的一个练习,我自己无法解决。我知道我可以使用函数来轻松实现...但我想知道如何用宏来做。

谢谢!

4 个答案:

答案 0 :(得分:1)

#define foo(x,i) (((x) & (3<<i)) == (3<<i)) ? ((x) - (3 << i)) : (x)
#define clear_11(x) foo(foo(foo(foo(foo(foo(foo(foo(foo(x,8),7),6),5),4),3),2),1),0)

这将完成这项工作。然而,扩展是相当大的,编译可能需要一段时间。所以不要在工作中尝试这个;)

答案 1 :(得分:0)

答案 2 :(得分:0)

#define clear_bit_pairs(_x) ((_x) ^ ((((_x)&((_x)>>1))<<1) | ((_x)&((_x)>>1))) )

这样可行,但不会配对。如果它找到连续的'1',它将只是擦除。例如11100000将变为00000000,因为前111是连续的。

答案 3 :(得分:-1)

#define foo(x) ({ \
    typeof(x) _y_ = x; \
    for(int _i_ = 0; _i_ < (sizeof(typeof(x)) << 3) + 1; _i_++) { \
        if((_y_ >> _i_ & 3) == 3) { \
            _y_ &= ~(3 << _i_); \
        } \
    } \
    _y_; \
})

这可能仅适用于GCC,因为它使用内联语句。我没有测试过,所以它可能根本不起作用。让它发挥作用是你的工作。 : - )

关于这一点的好处是它可以使用任何整数类型。它也不依赖于任何外部功能。缺点是它不便携。 (我意识到这有点像作弊。)