2008-11-02 2 views
1

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

В C++, сказать, у меня есть

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

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

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

ответ

-2

Там нет Append в двоичном/шестнадцатеричном, потому что вы имеете дело с числами (вы можете добавить 1 и 2, и не путать в результате 12 с «реальным» 12?)

Вы можете разграничить их специальным символом, но вы не можете просто «конкатенировать» их.

0

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

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

EDIT: если ваш «ширина» определяется по всей ширине со всеми ведущими нулями удалены, то возможно сделать с перемещением и ORing, но сложнее.

-2

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

+0

он просит его в двоичном формате = P. это хорошо определенная операция.это также может быть полезно при создании таких вещей, как кодировка хаффмана. – Claudiu 2008-11-02 18:32:31

19

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

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

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

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

+0

В последнем предложении, предполагая, что вы говорите об объединении char [2] с коротким, это зависит от сущности. – 2008-11-02 19:38:26

0

конкатенации два символа:

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

Я бы с массив символов.

unsigned short s; char * sPtr = & s; sPtr [0] = t; sPtr [1] = q;

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

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