c # преобразует два ushort-значения в один байт, используя младшие и старшие биты - PullRequest
0 голосов
/ 07 сентября 2018

У меня вопрос, мне нужно преобразовать в два коротких числа u, скажем, 1 и 2 в 1 байт. что-то вроде

0 0 1 0 значения 2 и 0 0 0 1 значения 1

поэтому в результате я получаю байт со значением 00100001, возможно ли, я не являюсь главным кодером низкого уровня.

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Я не мастер кодер низкого уровня.

Ну, сейчас самое время стать им!

Изменить: этот ответ был сделан до того, как вопрос стал достаточно ясным, чтобы точно понять, что требовалось. Смотрите другие ответы.

Используйте «битовую маску» для двух чисел, затем побитовые ИЛИ их вместе.
Я не могу точно сказать, как именно вы этого хотите, но допустим, что вы хотели первые 4 бита первого ushort, а затем последние 4 бита второго ushort. Примечание: ushort имеет ширину 16 бит.

ushort u1 = 44828; //10101111 00011100 in binary
ushort u2 = 65384; //11111111 01101000 in binary

int u1_first4bits = (u1 & 0xF000) >> 8;

«Маска» - 0xF000. Маскирует над u1:

44828         1010 1111 0001 1100
0xF000        1111 0000 0000 0000
bitwise-AND   1010 0000 0000 0000

Проблема в том, что этот новый номер по-прежнему имеет длину 16 бит - мы должны сдвинуть его на 8 бит с >> 8, чтобы сделать
0000 0000 1010 0000

Затем еще одна операция по маске для второго числа:

int u2_last4bits  =  u2 & 0x000F;

Иллюстрированный:

65384         1111 1111 0110 1000
0x000F        0000 0000 0000 1111
bitwise-AND   0000 0000 0000 1000

Здесь нам не нужно было сдвигать биты, так как они уже там, где мы их хотим.
Затем мы поразрядно-ИЛИ их вместе:

byte b1 = (byte)(u1_first4bits | u2_last4bits);
//b1 is now 10101000 which is 168

Иллюстрированный:

u1_first4bits 0000 0000 1010 0000
u2_last4bits  0000 0000 0000 1000
bitwise-OR    0000 0000 1010 1000

Обратите внимание, что u1_first4bits и u2_first4bits должны иметь тип int - это потому, что побитовые операции C # возвращают int. Чтобы создать byte b1, нам пришлось преобразовать операцию bitwase-OR в байт.

0 голосов
/ 07 сентября 2018

Предполагая, что вы хотите взять 2 ushorts (по 16 бит) и преобразовать их в 32-битное представление (целое число), вы можете использовать класс «BitArray», заполнить его 4-байтовым массивом и преобразовать вцелое число

Следующий пример выдаст:

 00000000 00000010 00000000 00000001

, что

 131073

как целое число.

ushort x1 = 1;
ushort x2 = 2;

//get the bytes of the ushorts. 2 byte per number. 
byte[] b1 = System.BitConverter.GetBytes(x1);
byte[] b2 = System.BitConverter.GetBytes(x2);

//Combine the two arrays to one array of length 4. 
byte[] result = new Byte[4];
result[0] = b1[0];
result[1] = b1[1];
result[2] = b2[0];
result[3] = b2[1];

//fill the bitArray.
BitArray br = new BitArray(result);

//test output.
int c = 0;
for (int i = br.Length -1; i >= 0; i--){

    Console.Write(br.Get(i)? "1":"0");
    if (++c == 8)
    {
        Console.Write(" ");
        c = 0;
    }
}

//convert to int and output. 
int[] array = new int[1];
br.CopyTo(array, 0);
Console.WriteLine();
Console.Write(array[0]);

Console.ReadLine();

Конечно, вы можете изменить этопример и выбросить 1 байт на ushort.Но тогда это не будет правильным «обращением».

0 голосов
/ 07 сентября 2018

Это должно работать:

 (byte)(((value1 & 0xF)<<4) | (value2 & 0xF))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...