Как использовать побитовые операторы для возврата 0 или 1 - PullRequest
0 голосов
/ 27 августа 2011

Моя функция принимает 32-битное целое число, и мне нужно вернуть 0 или 1, если это число имеет 1 в любой четной позиции. Я не могу использовать любые условные операторы, я также могу получить доступ только к 8 битам за раз.

Вот пример ввода: 10001000 01011101 00000000 11001110

1) Сдвиньте биты и их с помощью AA (10101010) и сохраните каждый в переменной.

int a = 10001000
int b = 1000
int c = 0
int d = 10001010

Теперь мне нужно вернуть 0, если не было установлено нечётных битов, и 1, если они были. Как мы видим, были. Поэтому мне нужно объединить их в один номер, а затем использовать! оператор, чтобы вернуть 0 или 1. Вот где у меня возникли проблемы.

int valueToReturn = a | b | c | d;

Теперь мне нужно сказать:

return !!valueTOReturn; 

Это не возвращает правильное значение, может кто-нибудь дать мне какое-либо понимание ???

Я не могу использовать какие-либо операторы условия, такие как || &&

Я понял это. Все, что я сказал, дает правильный ответ, но я взял неправильное значение для одной из моих переменных. Спасибо за помощь!

Ответы [ 4 ]

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

Как говорит bdares, это просто много побитовых операций ... evenbit_int вычисляется до запрашиваемого значения.

#define evenbit_byte(x) (((x) >> 1 | (x) >> 3 | (x) >> 5 | (x) >> 7) & 1)
#define evenbit_int(x) (evenbit_byte(x) | evenbit_byte(x >> 8) | evenbit_byte(x >> 16) | evenbit_byte(x >> 24))

или чуть более оптимизировано

byte evenbits(DWORD x)
{ 
  byte a = x >> 8;    
  byte b = x >> 16;    
  byte c = x >> 24;
  return (evenbit_byte(x) | evenbit_byte(a) | evenbit_byte(b) | evenbit_byte(c))
}
0 голосов
/ 27 августа 2011

Если вы не можете использовать условные выражения, вам придется сделать это ужасным способом: взять бит каждого бита четного индекса и вернуть ИЛИ из них. Вы можете пропустить маску. Это немного глупо и пахнет плохо сделанной домашней работой.

Отредактировал мой ответ, чтобы удалить ошибочную первую часть.

Похоже, что arnaud576875 правдиво логично! оператор: http://www.gnu.org/s/gnu-c-manual/gnu-c-manual.html#The-Logical-Negation-Operator

Пока кто-нибудь не сможет найти ссылку на спецификацию C99 (реализация GNU может отличаться от нее), я не буду знать наверняка, но я подозреваю, что ваша версия C такая же, как я описал ранее.

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

Прежде всего, вы не храните биты так, как думаете.

int a = 10001000

на самом деле составляет 10 001 000 (что в двоичном виде, b100110001001101001101000).

Вы говорите, что функция принимает 32-разрядное целое число, поэтому вы можете извлечь каждую из 8-разрядных частей следующим образом:

unsigned char a, b, c, d;
a = (unsigned char)(input & 0xff);
b = (unsigned char)((input >> 8) & 0xff);
c = (unsigned char)((input >> 16) & 0xff);
d = (unsigned char)((input >> 24) & 0xff);

Теперь вы можете выполнитьМаскировка / операция тестирования:

return (0xAA & a) | (0xAA & b) | (0xAA & c) | (0xAA & d);
0 голосов
/ 27 августа 2011

Но, я не знаю, правильно ли я понимаю, если a имеет 32-битное число, может быть отключен только бит ALL, если равен 0.

if(input_number == 0 )
return 0;
else 
return 1;
...