Здравствуйте!
Еще одна задача на побитовые операции. Ну никак они мне не даются, вы уж простите...
Напишите программу для функции invert(x, p, n), которая инвертирует (т.е. заменяет 1 на 0 и наоборот) n битов x, начинающихся с позиции р, оставляя другие биты неизменными.
LinuxForum.Fans
И опять побитовые операции.
Автор: hardorsoft
7 сообщений
2408 просмотров
1) составляете mask, где n битов начинающихся с позиции p равны единице, а всё остальное нули
2) x ^ mask
Может так?
text
invert(x, p, n)
{
return(x ^ ((~0 & (p+n)) << (p-n)));
}
не верно.
((~0 & (p+n)) -- попробуйте объяснить, чего хотели этим достичь (пошагово по действиям), и легко найдёте ошибку.
hardorsoft,
маску можно получить так :
text
(((~0u << (sizeof(0u)*8 - p - n +1)) >> (sizeof(0u)*8 - p - n +1)) >> ( p - 1)) << (p - 1)
работоспособность не проверял, т.к. писал "на коленке", но вроде оно =)
Логика получения маски, пример для n=2,p=5, счёт битов справа налево с 1, для простоты показаны младшие 8 бит:
text
0: 00000000
~0: 11111111
~0<<n: 11111100
~(~0<<n): 00000011
~(~0<<n)<<(p-n): 00011000Войдите или зарегистрируйтесь, чтобы ответить.