Обычно:
return a!=-1 && b!=-1 && c!=-1 && d!=-1;
Так как ~(-1) == 0
в 2-х машинах дополнения, а 0
- это ложное значение, мы можем уменьшить значение выше до
return ~a && ~b && ~c && ~d;
или, не полагаясь на дополнение 2:
return a+1 && b+1 && c+1 && d+1;
, но оно имеет неопределенное поведение при переполнении.
(Но, пожалуйста, используйте обычный способ. Вы можете забыть, что делает этот умный взлом спустя годы.)