int samples = 8;
for (unsigned int i = 0; i < (pow(double(2),samples)-1); i++)
{
unsigned int number = i << 1;
}
Я делаю кодирование в C ++ с использованием библиотеки Opencv.
Я хочу сделать битовое смещение через это, и это должно быть в диапазоне 0-255, но оно пересекает диапазон 255 и идет до 508.
В Matlab оператор битового сдвига поддерживает диапазон от 0 до 255. Узор в матлабе составляет 0,2,4 … 254,1,3,5 … 255. Но в C ++ это происходит 0,2,4,254,256,258 … 508.
Я хочу тот же ответ, что и Matlab. Пожалуйста, предложите мне идею сделать это.
Последовательность 0, 2, 4, 6, ..., 252, 254, 1, 3, 5, ..., 253, 255
(который, по-видимому, является тем, что вам нужно, на основе последовательности, которую вы показываете) может быть сгенерирован с
for (int i = 0; i != 257; i = (i == 254) ? 1 : i + 2)
doSomethingWith (i);
Вероятно, есть много других способов генерации этой последовательности, в том числе, что, вероятно, является более читаемой двухконтурной версией, при условии, что вы можете держать тело циклов небольшим:
for (int i = 0; i < 256; i += 2) doSomethingWith (i); // 0, 2, 4, 6, ..., 254
for (int i = 1; i < 256; i += 2) doSomethingWith (i); // 1, 3, 5, 7, ..., 255
В C ++ i << 1
эквивалентно i * 2
, если i
целое число без знака
Это не имеет ничего общего с «преобразованием 16-битного целого в 8-битное». Один из способов сделать это — замаскировать все биты, кроме младших 8: (number & 0xFF)
или эквивалентно (number % 256)
,
Если вы умножите на 2, а затем выполните это преобразование, вы получите 0
после 254
, Но это все еще не то, что вы хотите. Ваша целевая продукция имеет 1
добавлено ко второй половине.
Итак, чтобы получить это вы можете использовать:
for (int i = 0; i < 256; i++)
number = (i * 2) % 256 + (i >= 128);
Похоже, что Matlab делает круговое 8-битное смещение, когда abcdefgh << 1
становится bcdefgha
, C ++ не имеет такой вещи, но вы можете имитировать это
number = ((i << 1) & 0xff) | (i>> 7);