2008-11-02 60 views
1

如果我有两件东西是十六进制的,我可以如何将他们的二进制文件附加在一起得到一个值吗?位操作符

在C++中, 说我有

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

我要的是不知何故, 1100001010100011,这可能使用位运算符?

我想提取T和Q的二进制形式和追加他们...

回答

-2

有二进制/六角没有追加,因为你是用数字处理(可以追加1和2,而不是混淆导致12与“真正”12?)

你可以用一些特殊符号分隔它们,但你不能只是“连接”它们。

0

你的例子并没有太好的工作,因为输入值的宽度(通常是8位)没有定义。例如,为什么不是你的例子:0000000100000010,这将确实追加1(00000001)和2(00000010)位智慧。

如果每个值确实有一个固定的宽度然后它可以用位移位和或门来回答值

编辑:如果你的“宽度”与所有领先的零的删除,那么它定义的全宽可能与移位和ORing有关,但更复杂。

-2

作为一个操作追加对数字没有意义,无论他们在什么基础。使用。作为连接运算符:在你的例子中,0x1。如果连接十六进制,则0x2变为0x12;如果连接二进制,则0xb101变为0b101。但0x12和0b101不是相同的值(以10为底,分别为18和5)。一般来说,无论您使用何种基地,A O B(其中A和B都是数字,O是运营商)应该会得到相同的值。

+0

他要求在二进制= P。这是一个明确的操作。当做像哈夫曼编码这样的东西时,这实际上也是有用的。 – Claudiu 2008-11-02 18:32:31

19

是的,这是可能的。

只需使用左移位运算符,使用至少一个16位整数向左移8。然后二进制或第二个值到整数。

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

可选择地把两个值中含有2个字符(小心大端或小的)的联合将有相同的位的电平的结果。另一个选项是char [2]。

+0

在你的最后一句话中,假设你正在谈论一个char [2]和short的联合,它取决于endianness。 – 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 .. 我不知道你为什么想这样做,但这将工作。

位方法的问题是你不确定你有多大。 如果你知道的大小..我会去与布里亚斯回答