Как преобразовать 16-битное целое в 8-битное без потери значений данных 16-битного целого, когда диапазон 16-битного целого числа 0-255

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. Пожалуйста, предложите мне идею сделать это.

-2

Решение

Последовательность 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
2

Другие решения

В 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);
4

Похоже, что Matlab делает круговое 8-битное смещение, когда abcdefgh << 1 становится bcdefgha, C ++ не имеет такой вещи, но вы можете имитировать это

number = ((i << 1) & 0xff) | (i>> 7);
1