2013-06-24 2 views
1

Я хочу взять первые 4 бита одного байта и все биты другого бита и добавить их в eachother.
Это результат мне нужно достичь:Добавить часть байта в другой байт

enter image description here
Это то, что я сейчас:

private void ParseLocation(int UpperLogicalLocation, int UnderLogicalLocation) 
{ 
    int LogicalLocation = UpperLogicalLocation & 0x0F; // Take bit 0-3 
    LogicalLocation += UnderLogicalLocation; 
} 

Но это не дает правильные результаты.

int UpperLogicalLocation_Offset = 0x51; 
int UnderLogicalLocation = 0x23; 

int LogicalLocation = UpperLogicalLocation & 0x0F; // Take bit 0-3 
LogicalLocation += UnderLogicalLocation; 

Console.Write(LogicalLocation); 

Это должно дать 0x51 (0101) + 0x23 (00100011),
Так что результат я хочу достичь 0001 + 00100011 = 000100100011 (0x123)

+0

Похоже, вы думаете, что '+' будет выполнять эквивалент конкатенации строк. Что заставляет вас думать «0x51 + 0x23 = 000100100011'? – rliu

+0

Я знаю, что это самый умный комментарий, который вы когда-либо читали, но ваша функция 'ParseLocation' ничего не возвращает. – fiscblog

ответ

6

Вам нужно будет слева -Shift в UpperLogicalLocation биты от 8 до объединения битов:

int UpperLogicalLocation = 0x51; 
int UnderLogicalLocation = 0x23; 

int LogicalLocation = (UpperLogicalLocation & 0x0F) << 8; // Take bit 0-3 and shift 
LogicalLocation |= UnderLogicalLocation; 

Console.WriteLine(LogicalLocation.ToString("x")); 

Обратите внимание, что я также изменил += к |=, чтобы лучше выразить то, что ч appening.

3

Проблема в том, что вы храните верхние биты в битах 0-3 из LogicalLocation вместо битов 8-11. Вам нужно сдвинуть бит в нужное место. Следующие изменения должны исправить проблему:

int LogicalLocation = (UpperLogicalLocation & 0x0F) << 8; 

Также обратите внимание, что биты более идиоматически объединены с использованием логического или операционного. Так что ваша вторая линия становится:

LogicalLocation |= UnderLogicalLocation; 
3

Вы можете сделать это:

int LogicalLocation = (UpperLogicalLocation & 0x0F) << 8; // Take bit 0-3 
LogicalLocation |= (UnderLogicalLocation & 0xFF); 

... но будьте осторожны байтов! Ваша документация говорит, что UpperLogicalLocation следует сохранить в Byte 3, следующие 8 бит в Byte 4. Достичь этого, результат int LogicalLocation необходимо разбить на эти два байта правильно.

Смежные вопросы