2016-09-25 72 views
-1

例如,我有一个这样的代码:移在C++中的二进制数据

unsigned short a[2]; 

[bbbbbbbb][bbbbbbbb][bbbbxxxx][xxxxxxxx] // b : data, x : unused data 

如何这个二进制序列,使得它看起来像这样移位:

[000000bb][bbbbbbbb][bbbbbbbb][bbxxxxxx] 

换句话说,我想要在数据的开始插入六个零位(例如),然后将所有实际数据移到右侧。有没有办法做到这一点?

P.S:其实我想在unsigned int而不是unsigned short

+0

谁能解释为什么是我的问题downvoted? – xersi

+0

如果你不能回答这个问题,不要浪费你的声誉。我真的需要这个为我的项目。 – xersi

+0

使用std :: bitset在二进制文件上按位操作。 – seccpur

回答

-1

您可以使用>>向右移动一个int:

unsigned int a = 0x1234abcd; 
a = a >> 6; 

一个变0x48d2af。同样,使用<<左移。

编辑:

使用uint32_t<cstdint>保证32位长(或使用uint16_t,或uint64_t)。然后,你可以在路上移动你想要的:

uint32_t a = 0xFFFF1234; 
unit32_t b = 0xFF000000; 
int shiftAmount = 16; 


b = (b >> shiftAmount) | (a << (32 - shiftAmount)) ; 
a = a >> shiftAmount; 

这给: a = 0x0000FFFFb = 0x1234FF00

+0

如果a是** 0xFFFFFFFF **会怎么样。这是否意味着你可能会失去一些数据? – xersi

+0

我想以某种方式移动二进制序列,而不会丢失实际数据。 – xersi

+0

@xersi根据定义进行位移会导致一些位数减少。 '0xFFFFFFFF >> 16 = 0x0000FFFF'。我不确定“不丢失数据”的移位点是 –