Вот лучшее, что я мог придумать:
y = (((-x) | x) >> (BITS - 1)) & 1;
, где BITS = 32 для 32-битных, т. Е. BITS = sizeof(int) * CHAR_BIT;
Вот тестовая программа:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char *argv[])
{
const int BITS = sizeof(int) * CHAR_BIT;
if (argc == 2)
{
int x = atoi(argv[1]);
int y = (((-x) | x) >> (BITS - 1)) & 1;
printf("%d -> %d\n", x, y);
}
return 0;
}