Как уже было сказано, минимальное решение будет
return (x & 0x55555555) == 0x55555555 ;
Однако, здесь используется '==', которого нет в списке разрешенных операторов. Сравнение целых чисел более или менее эквивалентно тому, чтобы видеть, равна ли разница между числами ноль или нет, но «-» также отсутствует в списке разрешенных операторов, но «+» есть. Установка первого бита в целом числе со знаком равносильна тому, чтобы сделать его отрицательным и вычесть 1. Следовательно, функцию можно записать в виде:
return !(((x & 0x55555555) | 0x80000000) + 0x55555556);
Это предполагает, что ввод не отрицательный, и, похоже, также не работаетдля очень большого ввода, но работает для чисел в диапазоне от 0 до 1431655764 в моих тестах. Кроме того, здесь предполагаются 32-разрядные целые числа.
Редактирование: оператор XOR, очевидно, является гораздо более подходящей заменой '==':
return !((x & 0x55555555) ^ 0x55555555);
Работает и для отрицательных чисел!