2013-03-17 2 views
1

Есть ли способ изменить следующий бит-сдвиг, чтобы я мог извлечь значения 6972307/1/2/3? Если нет, я действительно «нуждаюсь» в значении (1 < < 17).C# Обратное смещение бит

long shifted = (6972307 << 22) | (1 << 17) | (2 << 12) | 3; 

Дополнительный фон.

Значение сдвинуты на 17 имеет максимальное значение 6 и сдвиг на 12 имеет максимальное значение 31.

ответ

2

Вы можете использовать комбинацию сдвигов и ANDs:

var v1 = shifted & 0xfff; //3 
var v2 = (shifted >> 12) & 0x1f; //2 
var v3 = (shifted >> 17) & 0x1f; //1 
var v4 = (shifted >> 22); 
1

Попробуйте преобразовать ваш 6972307 к задолго до сдвига, так что выражение будет выглядеть следующим образом:

long shifted = ((long)6972307 << 22) | (1 << 17) | (2 << 12) | 3; 

Таким образом, вы правильно сохраните все биты в длинной переменной, а не в переменной int. После этого вы можете получить значение 6972307 назад с правого сдвига

long shiftedBack = shifted >> 22; 

Однако обратите внимание, что значение, которое вы смещаются влево (6972307 в вашем примере) все равно необходимо иметь некоторый максимум. Над этим максимальным 22-битным сдвигом будут отрезаны некоторые биты, и вы не сможете правильно вернуться.

2

Да, вы можете добиться этого, щелкнув правой кнопкой сдвигая результат и маскировки нежелательных бит:

long top = shifted >> 22; 
long part1 = (shifted >> 17) & 7; 
long part2 = (shifted >> 12) & 31; 
long part3 = shifted & 3; 

Обратите внимание, что вы могли бы не получить правильный результат для верхней части в зависимости от количества бит, используемых long.

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