2016-09-25 4 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 а становится. Аналогично, используйте << влево.

Edit:

Использование 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 = 0x0000FFFF, b = 0x1234FF00

+0

Что делать, если a ** 0xFFFFFFFF **. Означает ли это, что вы, вероятно, потеряете некоторые данные? – xersi

+0

Я хочу перевести двоичную последовательность так, чтобы не потерять фактические данные. – xersi

+0

@xersi Переключение битов по определению заставляет некоторые биты сбрасываться с конца вашего номера. '0xFFFFFFFF >> 16 = 0x0000FFFF'. Я не уверен, что точка смещения бит «без потери данных» равна –

Смежные вопросы