Использование манипуляций с битами снижает затраты на кэширование
I have a raw12 file(4096 * 3072 ) where RGGB(odd rows RGRG..And even GBGB...) Pixels are stored ,12 bit for each .I have to use only 5 bit MSB data from each 12 bit data , I have to take 64 bit at a time for cache optimization and use bit manipulation to get 5 MSB bits for each 12 bit pixel,I am not getting , How should I achieve this ? This is code I wrote and working properly but rather than taking 8 bit at a time(buffer is 8bit pointer) I have to take 64 bits . In buffer I have pointed complete file. *This code is to make a histogram. Taking LITTLE ENDIAN into consideration code is in C .
Что я уже пробовал:
for(int i = 0; i < length; i += 3){ if (i % (3 * 2 * num_cols / 2) < num_cols * (3) / 2) { /* ODD ROW */ hist[0][buffer[i] >> 3]++; /* CH[0] */ hist[1][buffer[i+1] & 0x0F << 1 | /* CH[1] */ buffer[i+2] >> 7]++; } else { /* EVEN ROW*/ hist[2][buffer[i] >> 3]++; /* CH[2] */ hist[3][buffer[i+1] & 0x0F << 1 | /* CH[3] */ buffer[i+2] >> 7]++ ; } }
Gerry Schmitz
Серьезно?
если (i % (3 * 2 * число_столбцов / 2) &ЛТ; число_столбцов * (3) / 2) { /* нечетные строки */
Остальная часть "вашего кода" тоже пахнет.
Stefan_Lang
А Джерри мог бы быть и больше ... многословный, он действительно имеет смысл: вы вкладываете много вычислительных шагов в каждое выражение. Это очень затрудняет понимание того, что вы пытаетесь сделать, и это огромный источник ошибок, как ясно видно из условия if, которое процитировал Джерри: вы сравниваете модуль с целым числом - несмотря ни на что, это никогда не бывает хорошей идеей и обычно указывает на ошибку. Это на том же уровне, что и сравнение знаковых и беззнаковых значений, градусы в диапазоне от -180 до 180 делают значение градуса между 0 и 360, или даже дюймы к миллиметрам, Градусы к радианам.
Точно так же выражения для извлечения 12-битных значений из вашего буфера делают много вещей одновременно, и между правилами приоритета операторов, порядком следования и использованием побитовых и логических операторов эти выражения представляют собой полный беспорядок: почти невозможно сказать, что они вычисляют. Вы действительно должны разбить свой код на простые выражения, а затем использовать отладчик, чтобы убедиться, что на каждом шаге ваши промежуточные значения соответствуют ожидаемым.