bool fits16(int x)
{
short y = x;
return y == x;
}
Шучу :) Вот реальный ответ, предполагая, что int - это 32 бита, а short - 16 бит и два дополнительных представления:
Редактировать: Пожалуйста, смотрите последнее изменение для правильного ответа!
bool fits16(int x)
{
/* Mask out the least significant word */
int y = x & 0xffff0000;
if (x & 0x00008000) {
return y == 0xffff0000;
} else {
return y == 0;
}
}
Без утверждений if я полагаю, что должен это сделать:
return (
!(!(x & 0xffff0000) || !(x & 0x00008000)) ||
!((x & 0xffff0000) || (x & 0x00008000))
);
Редактировать: Оли прав. Я почему-то думал, что им позволили. Вот последняя попытка с объяснением:
Нам нужно, чтобы 17 старших разрядов x
были либо всеми единицами, либо всеми нулями. Итак, начнем с маскировки других битов:
int a = x & 0xffff8000; // we need a to be either 0xffff8000 or 0x00000000
int b = a + 0x00008000; // if a == 0xffff8000 then b is now 0x00000000
// if a == 0x00000000 then b is now 0x00008000
// in any other case b has a different value
int c = b & 0xffff7fff; // all zeroes if it fits, something else if it doesn't
return c;
Или более кратко:
return ((x & 0xffff8000) + 0x8000) & 0xffff7fff;