// Обмен двух групп бит внутри слова.
unsigned int SwapGrBits(
unsigned int sou, // Исходное число.
unsigned char pos1, // Начальная позиция первой группы бит.
unsigned char pos2, // Начальная позиция второй группы бит.
unsigned char kol // Количество бит в каждой группе.
)
{
register unsigned int tmp; // Вспомогательная переменная.
// Проверка допустимости вх. аргументов (опцион.).
if( pos1 > (sizeof(sou)<<3)) { pos1 %= (sizeof( sou )<<3); }
if( pos2 > (sizeof(sou)<<3)) { pos2 %= (sizeof( sou )<<3); }
if( kol > (sizeof(sou)<<3)) { kol %= (sizeof( sou )<<3); }
tmp = ((sou >> pos1) ^ (sou >> pos2)) & ((1U << kol) - 1);
return( sou ^ ((tmp << pos1) | (tmp << pos2)) );
}