Почему все усложняется?
int isNonZero(int x) {
return x;
}
Это работает, потому что соглашение C гласит, что каждое ненулевое значение означает истину, поскольку isNonZero возвращает допустимое int.
Некоторые люди утверждали,функция isNonZero () должна возвращать 1 для входа 3, как показано в примере.
Если вы используете C ++, все так же просто, как и раньше:
int isNonZero(int x) {
return (bool)x;
}
Теперь функция возвращает 1, есливы предоставляете 3.
ОК, он не работает с C, который пропускает правильный логический тип.
Теперь, если вы предполагаете, что целые числа 32-битные и допускается +:
int isNonZero(int x) {
return ((x|(x+0x7FFFFFFF))>>31)&1;
}
На некоторых архитектурах вы можете даже избежать финального &1
, просто приведя x к unsigned (который имеет нулевую стоимость времени выполнения), но это Undefined Behavior, следовательно, зависит от реализации (зависит, если целевая архитектура использует подписанный илилогический сдвиг вправо).
int isNonZero(int x) {
return ((unsigned)(x|(x+0x7FFFFFFF)))>>31;
}