Что вы испытываете, так это правильное поведение оператора сдвига.
Давайте начнем с иллюстрации десятичного представления байта:
ByteDecValue =
bit0 * 2^0 +
bit1 * 2^1 +
bit2 * 2^2 +
bit3 * 2^3 +
bit4 * 2^4 +
bit5 * 2^5 +
bit6 * 2^6 +
bit7 * 2^7
Так, например, десятичное значение, соответствующее к байту 00010010b
равно 2^4 + 2^1 = 18 dec
.
Интересный конкретный сценарий возникает, когда только один байт равен 1. Получив формулу из приведенного выше, мы можем сказать
ByteDecValue_bit_N = 2^N
2^0 = 1 << 0 = 0000 0001
2^1 = 1 << 1 = 0000 0010
2^2 = 1 << 2 = 0000 0100
2^3 = 1 << 3 = 0000 1000
2^4 = 1 << 4 = 0001 0000
2^5 = 1 << 5 = 0010 0000
2^6 = 1 << 6 = 0100 0000
2^7 = 1 << 7 = 1000 0000
Это именно то, что вы испытываете: сдвигая 1 влево N раз, вы получаете одиночную 1 в позиции N, поэтому сила 2 ^ N.
Примечание: ваш тест было бы завершено путем печати также значение 1 << 0
. В этом случае вы получили бы 2^0 = 1
. Отсутствие сдвига означает сохранение исходного значения.