Во-первых, в вашем решении это должно быть
return ((x > 0) && ((x & (~x + 1)) == x));
, поскольку отрицательные числа не могут быть степенью 2. В соответствии с вашим требованием нам нужно преобразовать ">", "&&", "== "в разрешенные операторы.
Сначала подумайте о"> ", целом числе> 0, когда его знаковый бит равен 1, а он не равен 0;поэтому мы считаем
~(x >> 31) & (x & ~0)
это выражение, приведенное выше, вернет ненулевое число, если x не является положительным.Обратите внимание, что ~ 0 = -1, что составляет 0x11111111.Мы используем x & ~ 0, чтобы проверить, все ли эти числа равны 0 для каждой цифры.
Во-вторых, мы рассматриваем "&&".AND довольно прост - нам нужно только получить 0x01 и 0x01, чтобы вернуть 1. Так что здесь нам нужно добавить (!!) перед нашим первым ответом, чтобы изменить его на 0x01, если он возвращает ненулевое число.
Наконец, мы рассмотрим "==".Чтобы проверить эквити A и B, нам нужно только сделать
!(A ^ B)
Итак, наконец, у нас есть
return (!!(~(x >> 31) & (x & ~0))) & (!((x&(~x+1)) ^ x))
Кажется, что это домашнее задание.Пожалуйста, не просто копируйте и вставляйте.Мой ответ немного неловкий, он может быть улучшен.