Написание макроса C - PullRequest
       17

Написание макроса C

3 голосов
/ 15 апреля 2010

Мне нужно написать макрос, который получит в качестве параметра некоторую переменную, и для каждых двух последовательных битов со значением «1» замените его на 0 бит.

Например: 10110100 станет 10000100.
И, 11110000-> 00000000
11100000-> 100000000

У меня проблемы с написанием этого макроса. Я попытался написать макрос, который получает бит wach и заменяет его, если следующий бит одинаков (и они оба равны 1), но он работает только для 8 бит, и это очень не дружелюбно ...

P.S. Мне нужен макрос, потому что я изучаю C, и это упражнение я нашел, и сам не смог его решить. я знаю, что могу использовать функцию, чтобы сделать это легко ... но я хочу знать, как сделать это с макросами.

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 апреля 2010
#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)

Это сделает работу. Однако расширение довольно большое, и компиляция может занять некоторое время. Так что не пробуй это на работе;)

0 голосов
/ 15 апреля 2010
#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, так как он использует встроенные операторы. Я не проверял это, так что это, вероятно, не работает вообще. Это ваша работа, чтобы заставить это работать. : -)

Приятно то, что он будет работать с любым целым типом. Он также не зависит от каких-либо внешних функций. Недостатком является то, что он не является портативным. (И я понимаю, что это своего рода обман.)

0 голосов
/ 15 апреля 2010
#define clear_bit_pairs(_x) ((_x) ^ ((((_x)&((_x)>>1))<<1) | ((_x)&((_x)>>1))) )

Это будет работать, но не будет сопряжено. Если он находит последовательный «1», он просто стирается. например, 11100000 станет 00000000, потому что первые 111 являются последовательными.

0 голосов
/ 15 апреля 2010
#define clear_bit_pairs(_x) ((_x)&~(((_x)&((_x)>>1))*3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...