我必须编写一个宏作为参数获取一些变量,并且对于每个带有“1”值的两个连续位,将其替换为0位。
例如:10110100将变为10000100
并且,11110000-> 00000000
11100000->亿
我在编写宏时遇到了麻烦。我已经尝试编写一个宏来获取wach位并替换它,如果下一位是相同的(并且它们都是1),但它只适用于8位并且它非常不友好......
P.S。我需要一个宏,因为我正在学习C,这是我发现的一个练习,我自己无法解决。我知道我可以使用函数来轻松实现...但我想知道如何用宏来做。
谢谢!
答案 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,因为它使用内联语句。我没有测试过,所以它可能根本不起作用。让它发挥作用是你的工作。 : - )
关于这一点的好处是它可以使用任何整数类型。它也不依赖于任何外部功能。缺点是它不便携。 (我意识到这有点像作弊。)