Я обнаружил нечто странное, что не могу объяснить. Если кто-то здесь может увидеть, что или почему это происходит, я хотел бы знать. То, что я делаю, берет беззнаковый шорт, содержащий 12 битов, выровненных по максимуму, вот так:
1111 1111 1111 0000
Затем я хочу сместить биты так, чтобы каждый байт в короткой позиции удерживал 7 бит с MSB в качестве пэда. Результат, представленный выше, должен выглядеть следующим образом:
0111 1111 0111 1100
То, что я сделал, это:
unsigned short buf = 0xfff;
//align high
buf <<= 4;
buf >>= 1;
*((char*)&buf) >>= 1;
Это дает мне что-то похожее на то, что это правильно, но результат последнего сдвига оставляет бит установленным так:
0111 1111 1111 1100
Очень странно. Если я использую неподписанный символ в качестве временного хранилища и сдвигаю его, то он работает, например:
unsigned short buf = 0xfff;
buf <<= 4;
buf >>= 1;
tmp = *((char*)&buf);
*((char*)&buf) = tmp >> 1;
Результат этого:
0111 1111 0111 1100
Есть идеи, что здесь происходит?