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

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

1010

1 — старший бит.

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

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

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

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


person David    schedule 26.08.2011    source источник
comment
Это домашнее задание? Вы захотите использовать оператор побитового и (&). Можно даже использовать побитовое ИЛИ (|), но & в этой ситуации более удобен.   -  person Marlon    schedule 27.08.2011


Ответы (2)


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

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

10101010101010101010101010101010

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

#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);
}
person orlp    schedule 26.08.2011
comment
Ну, дело в том, что я могу использовать только 8-битный make, так что только AA. Я думал о смещении битов на 24 точки, получить эти 8, а затем и все. Затем в другой переменной сдвиньте 16 бит и немного другим номером, чтобы заменить 8 бит, которые находятся перед ней. После этого, хотя я не знаю, как их объединить, если это сработает. У тебя есть идеи? - person David; 27.08.2011
comment
@David: Не могли бы вы перефразировать, пожалуйста? Я ничего не получил. - person orlp; 27.08.2011
comment
Поэтому я могу играть только с фрагментами, подобными этому: 10011100 00110101 11010000 00010101. Мне нужно оценить каждый фрагмент, чтобы увидеть, есть ли в нем четный тег, который был помечен в моем и. Поэтому я сдвигаю каждый фрагмент либо на 24,16, либо на 8, а затем и сейчас у меня будут помеченные значения. Как я могу объединить их или выяснить, была ли 1 в каком-либо из моих кусков? - person David; 27.08.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;
}
person wallyk    schedule 26.08.2011
comment
Я вижу, что ваш код точно такой же, как мой, а мой (сохраните условные обозначения) и был опубликован на 12 минут раньше. Пожалуйста, рассмотрите возможность удаления ответа или добавления новой информации. - person orlp; 27.08.2011
comment
Что ж, поздравляю... Вам все же удалось получить за это два голоса. Кстати, ваша функция isbitset не работает, совет: посмотрите на bitnum. - person orlp; 27.08.2011
comment
@nightcracker: мой код менее подробен и использует более прямые операции для достижения результатов, поэтому он не совсем такой же, иначе я бы его не опубликовал. Хотя !! действителен, он неясен и, скорее всего, бесполезен — никогда. (Спасибо за указание на ошибку: она удалена.) - person wallyk; 27.08.2011