Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2012, 16:27   #1
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию Проблема с программой. Побитовые операторы. Си.

Задача:Напишите функцию setbits(x, p, n , y ) , возвращающую
значение х, в котором п битов, начиная с р-й позиции, заменены на п правых
разрядов из у (остальные биты не изменяются).

Только начал изучать си. Прочитал про побитовые операторы, но в целом не очень понял.
Хотелось бы увидеть от вас код данной программы с соответствующими объяснениями. Заранее спасибо.
Chelovekpredel вне форума Ответить с цитированием
Старый 10.06.2012, 17:49   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
#include <stdio.h>

void setbits(unsigned int *x, unsigned int p, unsigned int n, unsigned int y)
{
    *x=((*x)&(~((*x)<<p>>(32-n)<<(32-p-n))))|(y<<(32-n)>>p);
}

int main(void)
{
    unsigned int x=4095;
    printf("%u\n",x);
    setbits(&x,24,4,6);
    printf("%u",x);
    return 0;
}
100% гарантий работы не даю
4095=0000 0000 0000 0000 0000 1111 1111 1111
нумерация с 0 до 31 бита слева направо.
(*x)<<p, где p=24 -0000 0000 0000 0000 0000 1111 1111 1111 -> 1111 1111 0000 0000 0000 0000 0000 0000
(*x)<<p>>(32-n), где n=4 - 1111 1111 0000 0000 0000 0000 0000 0000 -> 0000 0000 0000 0000 0000 0000 0000 1111
(*x)<<p>>(32-n)<<(32-p-n) - 0000 0000 0000 0000 0000 0000 0000 1111 -> 0000 0000 0000 0000 0000 0000 1111 0000
Таким образом выделили N бит, начиная с P позиции в исходном числе:
0000 0000 0000 0000 0000 1111 1111 1111
0000 0000 0000 0000 0000 0000 1111 0000
~((*x)<<p>>(32-n)<<(32-p-n)) инвертируем биты:
1111 1111 1111 1111 1111 1111 0000 1111
Таким образом, получилась маска, в которой на местах, не требующих замены, единички, а на местах, требующих замены, биты, инвертированные относительно исходного числа.
Затем логическим "И" обнуляем требуемые биты, т.к. a and (not a)=0.
y<<(32-n)>>p - обнуляем первые 32-n бит числа Y, т.е. выделяем правые n бит, и ставим их позицию с p бита.
Командой логического "ИЛИ" соединяем биты в одно число.

ПС Это один из вариантов решения, коих можно придумать еще немало.

Без указателей:
Код:
#include <stdio.h>

unsigned int setbits(unsigned int x, unsigned int p, unsigned int n, unsigned int y)
{
    return (x&(~(x<<p>>(32-n)<<(32-p-n))))|(y<<(32-n)>>p);
}

int main(void)
{
    printf("%u %u",4095,setbits(4095,24,4,6));
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.06.2012 в 18:17.
BDA на форуме Ответить с цитированием
Старый 10.06.2012, 18:07   #3
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

А можно как-нибудь без указателей?
Chelovekpredel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с программой crazyW Помощь студентам 0 17.01.2012 20:15
Побитовые операторы (number && + number | 0 || 0) Викдон JavaScript, Ajax 0 05.10.2011 20:34
классы, операторы. Проблема this, op= [c++] icyFairy Помощь студентам 4 09.03.2010 20:37
Проблема с программой eks-s Общие вопросы Delphi 9 06.02.2008 09:47