Использование побитовых операторов C в референдуме - домашнее задание - PullRequest
2 голосов
/ 17 марта 2011

Я делаю домашнее задание на C и невероятно растерялся. По сути, я должен сделать функцию с именем Большинство , которая принимает 3 коротких целых числа и выплевывает другое число на основе входных данных. Я приведу пример из проекта:

Обычно я делаю функцию majority(101010101010101, 101010101010101, 101010101010101), и если в этом бите 2 или более единиц, возвращаем 1, иначе возвращаем 0.

Пока у меня есть

short majority(short a, short b, short c)
{
    return (a | b | c);
}

Теперь я знаю, что это совсем не так вообще , поэтому я спрашиваю здесь: как бы я поступил так? Спасибо за помощь, и я прошу прощения, если за этим трудно следовать. Я могу редактировать по мере необходимости.

Ответы [ 2 ]

7 голосов
/ 17 марта 2011

Существует несколько способов сделать это, но есть одна возможность:

short majority(short a, short b, short c)
{
    return (a & b) | (b & c) | (c & a);
}

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

2 голосов
/ 17 марта 2011

Если я вас правильно понимаю, вы хотите, чтобы бит был установлен в целое число результата, если и только если соответствующий бит установлен в двух или трех входных целых числах.

... так что если бит установленв первом числе, и соответствующий бит установлен в одном из последних двух чисел, или соответствующий бит установлен в обоих последних двух числах, поэтому в битовом выражении:

result = (a & (b | c)) | (b & c);
...