У меня есть 3-элементное перечисление, оно определяет один из трех контекстов, например, красный, зеленый или синий.Это перечисление используется в цикле с миллионами итераций, например, много пикселей.Поля в настоящее время находятся на расстоянии int
, по умолчанию.Учитывая желаемый производственный порядок R, G, B, R, G, B ..., я в настоящее время прибегаю к проверке, является ли значение в настоящее время B, таким образом присваивая его R, иначе увеличивая значение.
private enum CHANNEL_CONTEXT {RED, GREEN, BLUE} //here is a sample enum
//here is a sample loop with the relevant construct
CHANNEL_CONTEXT current = CHANNEL_CONTEXT.RED;
while(condition)
{
use current;
//...
if(current == CHANNEL_CONTEXT.BLUE)
current = CHANNEL_CONTEXT.RED
else
current+=1;
}
Есть ли способ обернуть перечисление из 3 полей одной операцией, так что не требуется ветвь, чтобы определить, настало ли время для переноса.Я знаю, что модуль (%
) отвечает всем требованиям, но моя мотивация основывается на производительности, и я бы в лучшем случае даже обошелся с такой дорогостоящей операцией (тестирование подтвердилось, но не исчерпывающе).
Дляесли посмотреть на мою повестку дня, если бы у меня было 256 соответствующих полей, я мог бы создать перечисление на основе байтов и увеличивать его безнаказанно и планировалось переполнение.Увы, у меня есть только три, и я не могу придумать, как манипулировать любым интегральным примитивом таким образом, чтобы три значения создавались циклически с использованием облегченной операции ALU, (+, -, &, ^, |, << ..так далее).Я также не смог бы придумать способ обмена битами без временного использования таких операций, но есть редко практичный, но возможный способ сделать это.</p>
Может кто-нибудь подсказать мне, как распределить 3 целочисленных значения перечисления так, чтобы они периодически проходили через обходы без необходимости ветвления и не использовали операторы на основе деления (например, модуль)?