LinuxForum.Fans
Тема

И опять побитовые операции.

Автор: hardorsoft 7 сообщений 2408 просмотров
#163754

Здравствуйте!
Еще одна задача на побитовые операции. Ну никак они мне не даются, вы уж простите...

Напишите программу для функции invert(x, p, n), которая инвертирует (т.е. заменяет 1 на 0 и наоборот) n битов x, начинающихся с позиции р, оставляя другие биты неизменными.

#163757

1) составляете mask, где n битов начинающихся с позиции p равны единице, а всё остальное нули
2) x ^ mask

#163782

Может так?

text

invert(x, p, n)
{
  return(x ^ ((~0 & (p+n)) << (p-n)));
}
#163798

не верно.

#163918

((~0 & (p+n)) -- попробуйте объяснить, чего хотели этим достичь (пошагово по действиям), и легко найдёте ошибку.

#163973

hardorsoft,
маску можно получить так :

text

(((~0u << (sizeof(0u)*8 - p - n +1)) >> (sizeof(0u)*8 - p - n +1)) >> ( p - 1)) << (p - 1)

работоспособность не проверял, т.к. писал "на коленке", но вроде оно =)

#164358

Логика получения маски, пример для n=2,p=5, счёт битов справа налево с 1, для простоты показаны младшие 8 бит:

text
0:                    00000000
~0:                   11111111
~0<<n:                11111100
~(~0<<n):             00000011
~(~0<<n)<<(p-n):      00011000
Войдите или зарегистрируйтесь, чтобы ответить.