Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Мне тут понадобилась битами жонглировать. Может, кому еще надо(+)

Отправлено Quasy 02 июля 2008 г. 16:17



//А может, кто-то в этом спец, и поделится своим вариантом.
// Замена группы бит в одной переменной на группу бит из другой.
// Аргументы макроса:
// kol_bit_mask - битовая маска из набора (0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff...0xffffffff),
// задающая длину заменяемой последовательности бит. Это должна быть
// непрерывная цепочка бит начинающаяся с нулевой позиции.
// Длина может быть от одной до 8 "единичек" для uchar, от одной до 16 для uint,
// или от одной до 24 для ulong.
// Здесь задается переменной, но обычно эта величина известна и как аргумент
// макросу не задается.(Cм. пример REPLACE_GROUP_2_BIT_ULONG).
// value - переменная, в которй заменяется цепочка бит.
// position_bit_val - позиция бита в переменной value, начиная с которой биты будут
// заменены. Счет от 0 бита.
// source - переменная, из которой будет браться заменяемая цепочка бит.
// position_bit_dest - позиция бита в переменной source, начиная с которой будут браться
// биты для замены. Счет от 0 бита.
#define REPLACE_GROUP_BIT(kol_bit_mask,value,position_bit_val,source,position_bit_sou) { \
value &= (~( (kol_bit_mask) << (position_bit_val) ) ); \
value |= (((((source) >> (position_bit_sou) ) & ( kol_bit_mask )) << (position_bit_val))); }
////////////// Как вариант REPLACE_GROUP_BIT - макрос замены цепочки из 2-х бит в ulong-переменной:
#define REPLACE_GROUP_2_BIT_ULONG(value,position_bit_val,source,position_bit_sou) { \
value &= (~( (3UL) << (position_bit_val) ) ); \
value |= (((((source) >> (position_bit_sou) ) & ( 3UL )) << (position_bit_val))); }
/////////////////
C_task main( void )
{
//-----------------------------------
{
// Замена цепочки из 1...8 бит (здесь - 3-х битовая цепочка )для uchar.
unsigned char a;
unsigned char b;
unsigned char mask;
unsigned char pos_value;
unsigned char pos_source;
a = 0xff; // Здесь буду менять биты
b = 0x00; // Отсюда буду брать биты
mask = ((1 << 0)|(1 << 1)|(1 << 2)); // Замене подлежит цепочка 3-х бит
pos_value = 4; // Заменяются биты переменной "a" начиная с 4-го
pos_source = 0; // Замена будет на биты из переменной "b" начиная с 0
REPLACE_GROUP_BIT( mask, a, pos_value, b, pos_source );
printf("%02x\n", a);
}
//-----------------------------------



//-----------------------------------
{
// Замена 2-х битовой цепочки для ulong
unsigned long a_l;
unsigned long b_l;
unsigned long pos_value_l;
unsigned long pos_source_l;
a_l = 0x3fffffffUL;
b_l = 0x00000003UL;
pos_value_l = 30UL;
pos_source_l = 0UL;
REPLACE_GROUP_2_BIT_ULONG( a_l, pos_value_l, b_l, pos_source_l );
printf("%08lx\n", a_l);
}
//-----------------------------------
}/*main*/


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 6 на 2:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru