Доступ к n-му биту без условного оператора - PullRequest
3 голосов
/ 27 августа 2011

Итак, у меня есть битовая последовательность:

1010

1 - это MSB.

Моя функция должна возвращать целое число 0, если нечетный бит равен 0, или 1, если его значение равно 1.

Я не могу использовать циклы for или что-то в этом роде, чтобы узнать, нужно ли мне возвращать 0 или 1. Есть ли у кого-нибудь предложения, как это сделать.

Я думал об использовании операции not, но я могу понять, как именно ее использовать.

Пока что я использую последовательность 1010 ... 10, а затем подхожу к ней. Выполнение этого с учетом вышесказанного дало бы мне 1010. Теперь мне нужно выяснить, возвращаю ли я 1 или 0.

Ответы [ 2 ]

8 голосов
/ 27 августа 2011

Скажем, мы говорим о 32-битных целых числах.Я предполагаю, что вы хотите знать, установлен ли ЛЮБОЙ бит ODD SET (1).

Для этого мы создаем целое число, которое выглядит следующим образом:

10101010101010101010101010101010

Теперь, если мы AND (&) этим все четные биты отфильтровываются.Теперь, если число не равно нулю, был установлен один или несколько нечетных битов.В C:

#include <stdint.h>

int hasodd(uint32_t x) {
    // 0xAAAAAAAA = 10101010101010101010101010101010
    // double negation to turn x>0 into 1 and leave 0 alone
    return !!(x & 0xAAAAAAAA); 
}

Если вы имели в виду, что должны возвращать, установлен ли N-й бит, это работает.Он сдвигает 1 вправо в правильное положение, чтобы отфильтровать все ненужные биты:

#include <stdint.h>

int nthbitset(uint32_t x, int n) {
    return x & (1 << n);
}
3 голосов
/ 27 августа 2011

Я не совсем понимаю смысл вашего вопроса - это похоже на домашнюю работу. В зависимости от ваших реальных потребностей (как, например, сказано в заголовке вопроса или в тексте), один из них будет работать в большинстве C реализаций:

int hasoddbitset (int v)
{
     return (v & 0xaaaaaaaa) != 0;  // for 32 bit ints
}

int isbitset (int val, int bitnum)
{
     return (val & (1 << bitnum)) != 0;
}
...