Читая об обработке растровых изображений в C ++, я наткнулся на этот блок кода
используется для загрузки цветовой палитры с данными, взятыми из растрового файла:
//set Number of Colors
numColors = 1 << bmih.biBitCount;
//load the palette for 8 bits per pixel
if(bmih.biBitCount == 8) {
colours=new RGBQUAD[numColours];
fread(colours,sizeof(RGBQUAD),numColours,in);
}
где «bmih.biBitCount» является предопределенной переменной, которая уже имеет значение.
Почему автор объявляет numColors равным 1, а затем присваивает значение bmih.biBitCount этой переменной в той же строке? что именно это делает и каковы преимущества присвоения переменной значение в два раза, как это?
Почему автор объявляет numColors равным 1, а затем присваивает значение bmih.biBitCount этой переменной в той же строке?
Он не; он присваивает результат выражения 1 << bmih.biBitCount
в numColors
, Назначение происходит последним. <<
это побитовый левый оператор сдвига. Думайте об этом так:
//set Number of Colors
numColors = (1 << bmih.biBitCount);
Он не делает, и это тот случай, когда использование <<
так как «потоковый» оператор сбивает людей с толку.
<<
а также >>
операторы традиционно были операторами сдвига битов, что является их смыслом в данном случае. Эти операторы сдвигают переменную влево или вправо на несколько мест. Скажем у нас x = 0b00001
(и ваш компилятор так понимает двоичную запись). x << 2
даст результат 0b00100
,