Carmageddon
05-12-2013, 16:11
Доброго дня товарищи. Ситуация такая , что не могу нагуглить, т.к. не знаю, что это за операция такая.
В общем - есть у меня переменная, 2 байта (пущай будет ushort), и для наглядности, значение у нее - 0xFFAA.
Суть в том, что я не хочу переменную длиной два байта, я хочу два байта. Байт а, со значением 0xFF и байт b со значением AA.
Что же я пробовал для этого сделать?
Собственно, для переменной b все просто - я сдвигаю все это дело вправо, дабы выгнать AA за границу "двух байт", и первые 8 разрядов заполнить нулями.
А вот для переменной b (той что AA), я извращаюсь так - сначала сдвигаю влево, чтобы выгнать FF за левую границу, а после, чтобы не было 8 значимых нулей, сдвигаю вправо :-D.
Ну вроде логично с точки зрения начинающего. Однако во второй операции, те 8 бит FF, что я сдвинул, при втором сдвиге "возвращаются" О_о (что за на***)
ushort a = (ushort)(0xFFAA >> 8); // выгнал AA за край, получил FF - все хорошо
ushort a = (ushort)((0xFFAA << 8) >> 8); // Выгоняю FF за левый край, и двигаю AA на место - FF возвращается, результат операции - 0xFFAA
Понимаю, что пояснил суть я по детски, но именно так я вижу битовый сдвиг)
Прав ли я в своих операциях, и FF "возвращается" (что за бредятина)), или же где то кроется ошибка.
Собственно, почему у меня не вышло, и как ushort (16 бит) порезать на 2 переменные типа byte (8 бит)?
P.s. я могу предположить, что при сдвиге влево .NET выделяет еще два байта, и посему у меня нифига не выходит (простая логика подсказывает)
Но почему я не могу сдвигать за левую границу, если могу за правую???
В общем - есть у меня переменная, 2 байта (пущай будет ushort), и для наглядности, значение у нее - 0xFFAA.
Суть в том, что я не хочу переменную длиной два байта, я хочу два байта. Байт а, со значением 0xFF и байт b со значением AA.
Что же я пробовал для этого сделать?
Собственно, для переменной b все просто - я сдвигаю все это дело вправо, дабы выгнать AA за границу "двух байт", и первые 8 разрядов заполнить нулями.
А вот для переменной b (той что AA), я извращаюсь так - сначала сдвигаю влево, чтобы выгнать FF за левую границу, а после, чтобы не было 8 значимых нулей, сдвигаю вправо :-D.
Ну вроде логично с точки зрения начинающего. Однако во второй операции, те 8 бит FF, что я сдвинул, при втором сдвиге "возвращаются" О_о (что за на***)
ushort a = (ushort)(0xFFAA >> 8); // выгнал AA за край, получил FF - все хорошо
ushort a = (ushort)((0xFFAA << 8) >> 8); // Выгоняю FF за левый край, и двигаю AA на место - FF возвращается, результат операции - 0xFFAA
Понимаю, что пояснил суть я по детски, но именно так я вижу битовый сдвиг)
Прав ли я в своих операциях, и FF "возвращается" (что за бредятина)), или же где то кроется ошибка.
Собственно, почему у меня не вышло, и как ushort (16 бит) порезать на 2 переменные типа byte (8 бит)?
P.s. я могу предположить, что при сдвиге влево .NET выделяет еще два байта, и посему у меня нифига не выходит (простая логика подсказывает)
Но почему я не могу сдвигать за левую границу, если могу за правую???