Если у меня есть две шестнадцатеричные вещи, могу ли я кто-нибудь, как сложить их двоичный файл, чтобы получить значение?
В C++ скажи, что у меня есть
unsigned char t = 0xc2; // 11000010
unsigned char q = 0xa3; // 10100011
Я хочу как-то,
1100001010100011, возможно ли это с помощью побитовых операторов?
Я хочу извлечь двоичную форму t и q и добавить их ...





В двоичном / шестнадцатеричном формате нет добавления, потому что вы имеете дело с числами (можете ли вы добавить 1 и 2 и не путать полученные 12 с «настоящими» 12?)
Вы можете разделить их каким-нибудь специальным символом, но вы не можете просто «объединить» их.
Ваш пример на самом деле не работает слишком хорошо, потому что ширина (обычно 8 бит) входных значений не определена. Например, почему не ваш пример: 0000000100000010, который действительно добавлял бы 1 (00000001) и 2 (00000010) побитно.
Если каждое значение имеет фиксированную ширину потом, на него можно ответить сдвигом битов и значениями ИЛИ.
Обновлено: если ваша «ширина» определена как полная ширина с удаленными ведущими нулями, то это можно сделать со сдвигом и операцией ИЛИ, но более сложным.
Добавление в качестве операции не имеет смысла для чисел, независимо от того, в какой базе они находятся. Использование. в качестве оператора конкатенации: в вашем примере 0x1. 0x2 становится 0x12, если вы объединяете шестнадцатеричный код, и 0b101, если вы объединяете двоичный файл. Но 0x12 и 0b101 не одно и то же значение (в базе 10 это 18 и 5 соответственно). В общем, A O B (где A и B - числа, а O - оператор) должны давать одно и то же значение независимо от того, на какой базе вы работаете.
Да, это возможно.
Просто используйте оператор сдвига влево, сдвигая влево на 8, используя как минимум 16-битное целое число. Затем двоичное ИЛИ 2-е значение на целое число.
unsigned char t = 0xc2; // 11000010
unsigned char q = 0xa3; // 10100011
unsigned short s = (((unsigned short)t)<<8) | q; //// 11000010 10100011
В качестве альтернативы объединение обоих значений в объединение, содержащее 2 символа (с обратным порядком байтов или малым), приведет к одинаковому результату битового уровня. Другой вариант - char [2].
В вашем последнем предложении, предполагая, что вы говорите об объединении char [2] с сокращением, это зависит от порядка байтов.
плюс, если вы используете << 8 для беззнакового char, вы получите ноль (поскольку беззнаковый char составляет 8 бит, вы сдвигаете все биты за пределы диапазона). Перед сменой произнесите t на короткое время.
@OJ. Математические операции C продвигают символы и short до int, поэтому нет необходимости приводить
Объединение двух символов:
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;
Я бы пошел с массивом символов.
беззнаковые короткие s; char * sPtr = & s; sPtr [0] = t; sPtr [1] = q;
Это на самом деле не заботится о порядке байтов .. Я не уверен, зачем вам это нужно, но это сработает.
Проблема с битовыми методами заключается в том, что вы не знаете, какой у вас размер. Если вы знаете размер ... Я бы пошел с ответом Брайанса
он просит это в двоичном формате = P. это четко определенная операция. это также может быть полезно при выполнении таких вещей, как кодирование Хаффмана.