2015-02-26 4 views
1

Я не совсем уверен, что произойдет в этом процессе и каков будет результат. Я никогда не сталкивался с использованием & & в обратном или, особенно, в одном и том же возвратном выражении.C++ return bool with && in return statement - требуется пояснение

bool myfunction(unsigned int x) 
{ 
    return x && !(x & (x­ - 1)); 
} 

Мне хотелось бы уточнить, что происходит здесь и почему. Я смотрю вокруг, но msdn не работает и не может найти конкретных ответов на этот тип возврата.

+3

Это недопустимо C#. – Lee

+1

Скомпилирует ли этот код? Я удивлен, что x определяется как int, но оценивает bool ... (т. Е. Первый x, перед &&) – adv12

+2

Является ли это C/C++? Именование метода camelCase и отсутствие символа 'unsigned' довольно странно. –

ответ

4

Вот что это означает:

  • Начальная x часть означает x != 0
  • (x & (x-1)) часть означает «x не является степенью двойки» (т.е. равен нулю или имеет более чем один набор битов)
  • выражение !(x & (x-­1)) означает «x является степенью двух»

Поэтому , общее выражение означает, что «x - это положительная сила двух».

Чтобы узнать, почему x & (x-1) поможет вам найти полномочия двух, рассмотрите, что происходит с числами, которые имеют один бит, установленный по сравнению с числами, которые имеют два или более бит. Ряд с одним битом, когда декрементируется, будет производить последовательность, которая выглядит следующим образом:

000100000..000 <== x 
000011111..111 <== x-1 

При применении побитового-и пары чисел, как это, вы получаете ноль, потому что единственный бит, был установлен в x, теперь равен нулю, и все биты, установленные в x-1, были нулями в x.

Когда число имеет набор двух или более битов, то картина будет выглядеть следующим образом:

010100000..000 <== x 
010011111..111 <== x-1 

Теперь последний бит, который был установлен будет сброшен, но все биты впереди него остались бы установить в 1 , создавая ненулевой шаблон, когда «AND» -ed с исходным значением x.

+0

В обратном направлении была небольшая опечатка, поскольку она должна была быть x - 1 не x1. Изменит ли этот ответ этот ответ? –

+0

Тег C# был удален. Теперь он помечен как C, так и C++ (в идеале он должен быть одним или другим). –

+0

Спасибо. это очень интересно, и я никогда не сталкивался с этим раньше. Ты узнаешь что-то новое каждый день. –

1

& & является логическим оператором and. Он возвращает true, если оба левого и правого выражений истинны. & - это побитовый оператор and. Возвращает биты, которые устанавливаются как в левом, так и в правом операндах.

Ну, это требует дополнительных разъяснений.

В основном, оператор & рассматривает отдельные байты. Например, рассмотрим:

int x = 1; int y = 2;

В этом случае x имеет 1 набор битов (это, ну, 1) и y имеет 1 бит слишком (это 10, 2 в двоичном коде). Итак, x & y даст 01 & 10 и, следовательно, 0, потому что нет битов, которые установлены как на x, так и на y.

В вашем случае он вернет true, если x истинно И отрицание x & x1 является чем-то отличным от 0, так как 0 является ложным значением.

https://msdn.microsoft.com/en-us/library/17zwb64t.aspx

+0

В обратном направлении была небольшая опечатка, поскольку она должна была быть x - 1 не x1. Изменит ли этот ответ этот ответ? –

+0

, который зависит от значения 'x' –