Я не мастер кодер низкого уровня.
Ну, сейчас самое время стать им!
Изменить: этот ответ был сделан до того, как вопрос стал достаточно ясным, чтобы точно понять, что требовалось. Смотрите другие ответы.
Используйте «битовую маску» для двух чисел, затем побитовые ИЛИ их вместе.
Я не могу точно сказать, как именно вы этого хотите, но допустим, что вы хотели первые 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 в байт.