2014-10-13 5 views
1

Я читал код для алгоритмов каталитических чисел в C, и я нашел фразу, которую я не совсем понимаю. Здесь (рекурсивно):C: Что означает x =! Y?

typedef unsigned long long ull; 

ull catalan2(int n) { 
int i; 
ull r = !n; 

for (i = 0; i < n; i++) 
    r += catalan2(i) * catalan2(n - 1 - i); 
return r; 
} 

Может кто-то пожалуйста, скажите ма, что фраза г = п отвечает за здесь!?

Спасибо заранее!

+3

Знаете ли вы, что '' делает в! C? –

+0

http://www.tutorialspoint.com/cprogramming/c_operators.htm –

+0

'if (n == 0) r = 1; else r = 0; ' –

ответ

1

х =! У означает «оценку у как логическое значение и возвращает противоположное логическое значение»

Так что, если у равен нулю, то оно ложно, и мы возвращаем истинное значение (то есть, 1). В противном случае y истинно, и мы возвращаем ноль.

1

ull r = !n; эквивалентен ull r = n == 0 ? 1 : 0;. Он учитывает пустое дерево, когда n == 0; цикл for подсчитывает непустые деревья.

0

r != n означает, что: назначить 0 если n ненулевая еще назначить 1 к r.

2

Это:

ull r = !n; 

равносильна этому:

ull r; 
if (n == 0) 
    r = 1; 
else 
    r = 0; 

на засыпку способ сделать это без отделения:

#include <limits.h> 
... 
ull r = 1-((unsigned)(n|(-n))>>(sizeof(n)*CHAR_BIT-1)); 
+0

Весьма вероятно, что хороший компилятор создаст более качественный код для оригинальной формулировки, чем версия без ветвей. Помимо вопроса о читаемости. (Пробовал с gcc: 3 не ветвящихся инструкций против 5.) – rici

+0

Хотя сложный способ, похоже, имеет проблемы с -INT_MIN, может зависеть от дополнения 2, без дополнений, yadda, yadda, +1 для добавления некоторого удовольствия в ответы , IAC первые 2/3rds ответов ясны и правильны. – chux

+0

@rici: Этот «ответвление» может привести к снижению производительности по сравнению с этим побитым операционным трюком. Это действительно зависит от базовой архитектуры HW, а также от назначенного компилятора. Но это наверняка приведет к ** непоследовательной производительности **, в зависимости от значения эвристики «n» и ветвления. Время выполнения «сложного пути» гарантируется одинаковым при каждом выполнении. –

Смежные вопросы