Я застрял там, пытаясь понять, как преобразовать последние два оператора «если» следующего кода в состояние без разветвления.Преобразование в вещественные последовательные операторы if
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
if (y > x) u = 5;
if (-y > x) u = 4;
Или, в случае выше оказывается слишком сложным, вы можете рассматривать их как:
if (x > 0) u = 5;
if (y > 0) u = 4;
Я думаю, что заставляет меня является тот факт, что те не имеют else
зрелище. Если бы это было так, я мог бы, вероятно, адаптировать вариацию бесконтактной функции abs
(или max
/min
).
rand()
Функции, которые вы видите, не являются частью реального кода. Я добавил их так, чтобы просто намекнуть на ожидаемые диапазоны, которые могут иметь переменные x
, y
и u
в то время, когда происходят две ветви.
Сборочный код машины разрешен для этой цели.
EDIT:
После немного braingrinding мне удалось собрать рабочую безфилиальные версию:
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
u += (4-u)*((unsigned int)(x+y) >> 31);
u += (5-u)*((unsigned int)(x-y) >> 31);
К сожалению, из-за целочисленную арифметику вовлеченной, оригинальная версия с если заявлениями оказывается быстрее на 30%.
Компилятор знает где вечеринка в.
У вас есть x и y в другом месте? Если нет, каждая из этих строк также может быть 'if (rand()% 2) ...'. –
'u + = (5 - u) * (y> x);'? –
@OliverCharlesworth Я вижу. Да, они используются в других местах. – user2464424