Регулировка числа на несколько элементов в массиве


Я работаю с следующий код, который регулирует интервал на основе нескольких элементов целочисленного массива. Я интересно, если есть чище, проще для чтения построить для этого:

int Blue = 0;
int[] Adjustments = new int[24];
// ... populate Adjustments

if (Adjustments[0] == 255)
    Blue = 128;
else if (Adjustments[0] == 0)
    Blue = 0;

if (Adjustments[1] == 255)
    Blue += 64;
else if (Adjustments[1] == 0)
    Blue += 0;

if (Adjustments[2] == 255)
    Blue += 32;
else if (Adjustments[2] == 0)
    Blue += 0;

if (Adjustments[3] == 255)
    Blue += 16;
else if (Adjustments[3] == 0)
    Blue += 0;

if (Adjustments[4] == 255)
    Blue += 8;
else if (Adjustments[4] == 0)
    Blue += 0;

if (Adjustments[5] == 255)
    Blue += 4;
else if (Adjustments[5] == 0)
    Blue += 0;

if (Adjustments[6] == 255)
    Blue += 2;
else if (Adjustments[6] == 0)
    Blue += 0;

if (Adjustments[7] == 255)
    Blue += 1;
else if (Adjustments[7] == 0)
    Blue += 0;

Какие-либо предложения?


Редактировать

Вот пересмотренный вариант на основе предоставленных предложения:

Blue = 0;
Green = 0;
Red = 0;
int[] Adjustments = new int[24];
// ... populate Adjustments

int[] AdjustmentStops = new[] { 128, 64, 32, 16, 8, 4, 2, 1 };
for (int i = 0; i < 8; i++)
{
    Blue += Adjustments[i] == 255 ? AdjustmentStops[i] : 0;
    Green += Adjustments[i + 8] == 255 ? AdjustmentStops[i] : 0;
    Red += Adjustments[i + 12] == 255 ? AdjustmentStops[i] : 0;
}


357
5
задан 30 марта 2011 в 04:03 Источник Поделиться
Комментарии
4 ответа

Как насчет следующих?

int Blue = 0;
int[] Adjustments = new int[ 24 ];
int[] BlueAdditions = new int[] { 128, 64, 32, 16, 8, 4, 2, 1 };
// ... populate Adjustments

for ( int i = 0; i < 8; ++i )
{
if ( Adjustments[ i ] == 255 )
{
Blue += BlueAdditions[ i ];
}
}

Почему вы делаете голубой += 0? Это довольно бессмысленно, так что я снял их.

Кроме того, почему корректировок 24 пунктов? Я предполагаю, что вы используете другие предметы на более поздний момент, если вы этого не сделаете, вы можете удалить магическое число 8 и изменить его настройки.Длина.

2
ответ дан 30 марта 2011 в 05:03 Источник Поделиться

Рискуя быть 'умным':

int Blue = 0;
int[] Adjustments = new int[24];
// ... populate Adjustments

for (int blueIndex=0; blueIndex<8; blueIndex++)
{
if (Adjustments[blueIndex] == 255)
{
Blue |= (1 << (7 - blueIndex));
}
}

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

7
ответ дан 30 марта 2011 в 07:03 Источник Поделиться

Blue = 0; Red = 0; Green = 0;
for(int i = 0; i < 8; i++)
{
Blue |= (Adjustments[i] / 255) * (1 << (i-7));
Red |= (Adjustments[i+8] / 255) * (1 << (i-7));
Green |= (Adjustments[i+16] / 255) * (1 << (i-7));
}

Или

Blue = 0; Red = 0; Green = 0;
a = 1;
for(int i = 7; i >= 0; i--)
{
Blue |= (Adjustments[i] / 255) * a;
Red |= (Adjustments[i+8] / 255) * a;
Green |= (Adjustments[i+16] / 255) * a;
a = a << 1;
}

2
ответ дан 30 марта 2011 в 10:03 Источник Поделиться

Хотя, возможно, менее эффективно, в любое время я вижу, что массив используется как недоделанный объект, я склонен сделать объект.

struct ColorAdjustment {
public int Red;
public int Blue;
public int Green;
}

Затем сделать массив из 8 тем.

Но поскольку вы только просмотрев два значения (0 или 255) набор значений, было бы еще лучше.
Но так как ты делаешь бит по математике, ответы @jon_darkstar-это даже еще лучше, потому что он просто делает, что математика напрямую.

Но лучше всего было бы, вероятно, использовать типа bitarray или сделать немного булевой логики на 24-битное значение (или значение типа int32, если вы не возражаете неиспользуемого пространства), чтобы указать на изменения, как:

Int24 adjustments = 0xBEAF;
for(int i = 0; i < 8; i++) {
if((adjustments && (1 << i)) != 0)
...do blue stuff...
if((adjustments && (1 << (i + 8))) != 0)
...do red stuff...
...

Редактировать:
Хах, и я просто понял, что я пробежал весь спектр от понятно, объектный код, основанный на неудобный бит-код.

-1
ответ дан 1 апреля 2011 в 10:04 Источник Поделиться