Побитовая версия поиска RGB в Java - PullRequest
3 голосов
/ 24 января 2011

У меня есть следующий метод, который получает значение rgb и классифицирует его, используя меньшую палитру:

private static int roundToNearestColor( int rgb, int nrColors )
    {
        int red = ( rgb >> 16 ) & 0xFF;
        int green = ( rgb >> 8 ) & 0xFF;
        int blue = ( rgb & 0xFF );
        red = red - ( red % nrColors );
        green = green - ( green % nrColors );
        blue = blue - ( blue % nrColors );
        return 0xFF000000 | ( red << 16 ) | ( green << 8 ) | ( blue );
    }

Код, который меня раздражает:

red = red - ( red % nrColors );
green = green - ( green % nrColors );
blue = blue - ( blue % nrColors );

Я уверен, что есть альтернативная побитовая версия, которая будет работать быстрее, но поскольку моя побитовая арифметика немного ржавая, у меня проблемы с поиском такого выражения. Любая помощь или комментарии будут оценены.

1 Ответ

1 голос
/ 24 января 2011

Если nrColors - это всегда степень 2:

private static int roundToNearestColor( int rgb, int nrColors )
{
    if (Integer.bitCount(nrColors) != 1) {
        throw new IllegalArgumentException("nrColors must be a power of two");
    }
    int mask = 0xFF & (-1 << Integer.numberOfTrailingZeros(nrColors));
    int red = ( rgb >> 16 ) & mask;
    int green = ( rgb >> 8 ) & mask;
    int blue = ( rgb & mask );
    return 0xFF000000 | ( red << 16 ) | ( green << 8 ) | ( blue );
}
...