Проверьте, не является ли число ненулевым, используя побитовые операторы в C - PullRequest
23 голосов
/ 12 октября 2010

Проверьте, является ли число x ненулевым, используя законные операторы, кроме !.

Примеры: isNonZero(3) = 1, isNonZero(0) = 0

Юридические операции: ~ & ^ | + << >>

  • Примечание: следует использовать только побитовые операторы.if, else, for и т. Д. Использовать нельзя.
  • Edit1: число операторов не должно превышать 10.
  • Edit2: Учитывать размер int для4 байта.

int isNonZero(int x) {
return ???;
}

Использование ! было бы тривиально, но как мы можем это сделать без использования !?

Ответы [ 14 ]

0 голосов
/ 17 марта 2012

Эта функция вернет x, если она не равна нулю, в противном случае она вернет 0.

int isNonZero(int x)
{
    return (x);
}
0 голосов
/ 14 октября 2010

Мое решение, хотя и не совсем связанное с вашим вопросом

int isSign (int x)

{
//return 1 if positive,0 if zero,-1 if negative
return (x > 0) - ((x & 0x80000000)==0x80000000)
}
0 голосов
/ 12 октября 2010

int isNonZero (int x)

{

if (  x & 0xffffffff)
    return 1;
else
    return 0;

}

Предположим, что Int равно 4 байта.

Возвращает 1, еслизначение не равно нулю

если значение равно нулю, оно вернет 0.

0 голосов
/ 12 октября 2010

в основном вам нужно или биты.Например, если вы знаете, что ваш номер имеет ширину 8 бит:

int isNonZero(uint8_t x)
{
    int res = 0;
    res |= (x >> 0) & 1;
    res |= (x >> 1) & 1;
    res |= (x >> 2) & 1;
    res |= (x >> 3) & 1;
    res |= (x >> 4) & 1;
    res |= (x >> 5) & 1;
    res |= (x >> 6) & 1;
    res |= (x >> 7) & 1;

    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...