Битовые операторы - PullRequest
       37

Битовые операторы

1 голос
/ 02 ноября 2008

Если у меня есть две вещи, которые являются шестнадцатеричными, могу ли я как-нибудь добавить их двоичный код вместе, чтобы получить значение?

В C ++, скажи, что у меня есть

unsigned char t = 0xc2;  // 11000010
unsigned char q = 0xa3;  // 10100011

То, что я хочу, так или иначе, 1100001010100011, возможно ли это с помощью побитовых операторов?

Я хочу извлечь двоичные формы t и q и добавить их ...

Ответы [ 6 ]

19 голосов
/ 02 ноября 2008

Да, это возможно.

Просто используйте оператор сдвига влево, сдвигая влево на 8, используя как минимум 16-разрядное целое число. Затем двоичное ИЛИ 2-е значение в целое число.

unsigned char t = 0xc2; // 11000010 
unsigned char q = 0xa3; // 10100011
unsigned short s = (((unsigned short)t)<<8) | q; //// 11000010 10100011

В качестве альтернативы, помещение обоих значений в объединение, содержащее 2 символа (с осторожностью относительно старшего или младшего байта) будет иметь одинаковый результат на уровне битов. Другой вариант - символ [2].

0 голосов
/ 03 ноября 2008

Я бы пошел с массивом символов.

беззнаковые короткие с; char * sPtr = & s; sPtr [0] = t; sPtr [1] = q;

Это на самом деле не заботится о порядке байтов Я не уверен, почему вы хотите это сделать, но это сработает.

Проблема с битовыми методами заключается в том, что вы не знаете, какой у вас размер. Если вы знаете размер .. Я бы пошел с ответом Brians

0 голосов
/ 02 ноября 2008

Объединение двух символов:

unsigned char t = 0xc2;  // 11000010
unsigned char q = 0xa3;  // 10100011

int result = t;  // Put into object that can hold the fully concatenated data;
result <<= 8;     // Shift it left
result |= q;     // Or the bottom bits into place;
0 голосов
/ 02 ноября 2008

Присоединение к операции не имеет смысла для чисел, независимо от того, в какой базе они находятся. Использование. как оператор конкатенации: в вашем примере 0x1. 0x2 становится 0x12, если вы соединяете гекс, и 0b101, если вы соединяете двоичный файл. Но 0x12 и 0b101 - это не одно и то же значение (в базе 10 они равны 18 и 5 соответственно). В общем, A O B (где A и B - числа, а O - оператор) должно давать одно и то же значение независимо от того, на какой базе вы работаете.

0 голосов
/ 02 ноября 2008

Ваш пример не очень хорошо работает, потому что ширина (обычно 8 бит) входных значений не определена. Например, почему не ваш пример: 0000000100000010, который действительно добавит 1 (00000001) и 2 (00000010) бит.

Если каждое значение имеет фиксированную ширину , тогда на него можно ответить с помощью сдвига битов и значений ORing

РЕДАКТИРОВАТЬ: если ваша "ширина" определена как полная ширина с удалением всех начальных нулей, то это возможно сделать со сдвигом и ORing, но более сложно.

0 голосов
/ 02 ноября 2008

В двоичном / шестнадцатеричном формате нет добавления, потому что вы имеете дело с числами (можете ли вы добавить 1 и 2 и не путать получающиеся 12 с «настоящими» 12?)

Вы можете разделить их специальным символом, но вы не можете просто "объединить" их.

...