Право сдвига номер дополнения два, как беззнаковое целое - PullRequest
1 голос
/ 29 августа 2011

Возможно ли это?У меня есть подписанный int и мне нужно сдвинуть его правильно на 4 места.Я не могу привести int к unsigned int, сдвинуть и затем вернуть обратно.Мне нужно разобраться с этим после.

Так что, если у меня есть битовая последовательность вроде:

x = 1001

и мне нужно сдвинуть ее вправо на 2 точки:

x = x >> 2;

Я получаю 1110;

Я хотел бы получить 0010. Я не могу придумать, как использовать и и, или или, чтобы сделать это.Любые идеи?

В частности, это то, что мне нужно.

0x12345678 замените 56 на 0xab и в конечном итоге это: 0x1234ab78

Мой метод получил право 56,

int right = Ox12345

слева от 56

int left = Ox 78

get 56

int replace = 56

вернуться вправо |левый |замените

и верните

Ox1234ab78

Я столкнулся с проблемами, если число слева от замены имеет 1 в качестве MSB.Потому что я сдвигаю всю вещь влево, а затем вправо, и она полностью переходит на 1.

Ответы [ 2 ]

1 голос
/ 29 августа 2011

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

x = (x >> 2) & ~((1 << 31) >> 1).Это дает тот же ответ, что и мой другой ответ, но устраняет необходимость в большом шестнадцатеричном числе.

1 голос
/ 29 августа 2011

Вы можете сделать x = (x >> 2) & 0x3FFFFFFF (если вы говорите о 32-битных целых числах).Это установит 2 старших бита на 0.

Редактировать:

Видя изменение вашей проблемы, вместо вашего метода вы можете сделать что-то вроде этого:

int result;
int start = 0x12345678, replace = 0xab;
result = (start & ~0xFF00) | (replace << 8);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...