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

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

Когда тебя хвалят у тебя воруют, когда тебя критикуют тебе дарят. - народная мудрость
Боже не делай меня слишком богатым, чтобы я не возгордился, но и не делай меня слишком бедным чтоб не пришлось мне воровать. -Эклезиаст.

2

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

95% процентов проблем находятся между клавиатурой и стулом.

3

Может так?

invert(x, p, n)
{
  return(x ^ ((~0 & (p+n)) << (p-n)));
}
Когда тебя хвалят у тебя воруют, когда тебя критикуют тебе дарят. - народная мудрость
Боже не делай меня слишком богатым, чтобы я не возгордился, но и не делай меня слишком бедным чтоб не пришлось мне воровать. -Эклезиаст.

4

не верно.

95% процентов проблем находятся между клавиатурой и стулом.

5

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

6

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

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

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

7

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

0:                    00000000
~0:                   11111111
~0<<n:                11111100
~(~0<<n):             00000011
~(~0<<n)<<(p-n):      00011000