Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как представить ushort двумя байтами? (http://forum.oszone.net/showthread.php?t=273472)

Carmageddon 05-12-2013 16:11 2267461

Как представить ushort двумя байтами?
 
Доброго дня товарищи. Ситуация такая , что не могу нагуглить, т.к. не знаю, что это за операция такая.
В общем - есть у меня переменная, 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 выделяет еще два байта, и посему у меня нифига не выходит (простая логика подсказывает)
Но почему я не могу сдвигать за левую границу, если могу за правую???

AMDBulldozer 05-12-2013 16:40 2267487

В С/С++ это делается при помощи объединения:
union TwoBytes
{
unsigned short Value;
char Byte1, Byte2;
};
Как с этим обстоит у Microsoft, извините, не знаю.

Carmageddon 05-12-2013 16:48 2267501

Нарыл вот такую штуку : побитовая маска
Вроде вот при таком подходе - получается
Код:

byte b = (byte)(0xFFAA & 0x00FF);
Т.е. насколько я понимаю, он выбирает значимые разряды числа 0xFFAA по маске 0x00FF, или же
Код:

0000 0000 1111 1111 (маска)
xxxx xxxx |||| ||||
1111 1111 1010 1010 (число)
=
0000 0000 1010 1010 (результат)

Однако второй нюанс вопроса, хотелось бы узнать - почему при побитовом сдвиге, происходит ситуация описанная в первом посте, и как именно она так происходит?
Есть конечно предположения, что при сдвиге влево, выделяется еще 2 байта (до int32 unsigned) и после приводятся (ushort).
Однако, хотел бы услышать мнение хорошего человека знающего c#

Цитата:

В С/С++ это делается при помощи объединения:
Мне нужно одну переменную 2 байта, разложить на 2 (по байту)


Время: 08:19.

Время: 08:19.
© OSzone.net 2001-