Официальный сайт студ.городка НГТУ
Программирование и БД » [C]Циклический сдвиг на n-бит 

#1  01.11.06 23:21

Igo
Профиль

[C]Циклический сдвиг на n-бит

Подскажите кто знает как осуществляется циклический сдвиг на заданное число бит на С.
Ситуация такая - надо циклически сдвинуть массив из 4 байт влево на 11 бит.
Если бы  знал ассемблер - то все наверное было бы проще, но может кто подскажет - он в этой ситуации может помочь или нет?

Исправлено Igo (01.11.06 23:21)

Offline

#2  01.11.06 23:44

Re: [C]Циклический сдвиг на n-бит

запросто
битовые операции юзай

Offline

#3  02.11.06 03:29

Re: [C]Циклический сдвиг на n-бит

Код: C++:

#include <bitset>
#include <iostream>
 
int main( )
{
   using namespace std;
   bitset<5> b1 ( 7 );
   cout << "The bitset b1 is: ( "<< b1 << " )." << endl;
 
   bitset<5> b2;
   b2 = b1 << 2;
 
   cout << "After shifting the bits 2 positions to the left,\n"
        << " the bitset b2 is: ( "<< b2 << " )."
        << endl;
   bitset<5> b3 = b2 >> 1;
 
   cout << "After shifting the bits 1 position to the right,\n"
        << " the bitset b3 is: ( " << b3 << " )."
        << endl;
}


Результат работы:

The bitset b1 is: ( 00111 ).
After shifting the bits 2 positions to the left,
the bitset b2 is: ( 11100 ).
After shifting the bits 1 position to the right,
the bitset b3 is: ( 01110 ).

Offline

#4  02.11.06 03:58

Re: [C]Циклический сдвиг на n-бит

simplex, >>, << - это не циклический сдвиг
прогони свой пример на числе 0xAA (bin = 10101010), некоторые биты потеряются

Offline

#5  02.11.06 08:18

Igo
Профиль

Re: [C]Циклический сдвиг на n-бит

otaku написал(а):

запросто
битовые операции юзай

подскажи какие.
Насколько я знаю, и  как сказал Fatboy, в си сдвиг есть, но он не циклический а логический, т.е. в данной ситуации не катит ((

Offline

#6  02.11.06 08:33

Re: [C]Циклический сдвиг на n-бит

ну тебе ещё надо будет юзать и и или операции

Offline

#7  02.11.06 12:09

Re: [C]Циклический сдвиг на n-бит

Вот формула, на досуге придумал

x = (x << C) + (x >> (sizeof(x)*8 - C)));

Это влево. Вправо соответственно все наоборот.

Offline

#8  02.11.06 12:14

Re: [C]Циклический сдвиг на n-бит

Можешь еще вставку на асме написать.
ROR - циклический сдвиг вправо, ROL - влево.

Например:
MOV AX, твоя переменная
MOV CL, C (C - на сколько сдвигать)
ROR AX, CL
MOV твоя переменная, AX

Исправлено Draloskop (02.11.06 12:15)

Offline

#9  02.11.06 12:16

Re: [C]Циклический сдвиг на n-бит

Код: cpp:

#include <iostream>
using namespace std;
 
unsigned long left_cycle_shift (unsigned long x, int n)  
// x - число, n - на сколько разрядов сдвинуть
{ 
	return (x << n) + (x >> (8*sizeof(x) - n));
}
 
void bin_out(unsigned long x)  // вывод двоичного числа на экран
{
	char buf[ 8 * sizeof(x) + 1 ];
	cout << itoa( x, buf, 2 ) << endl;
}
 
void main()
{
	unsigned long N = 0xAFAFAFAF, M = left_cycle_shift(N,4) ;
	bin_out (N);	// исходное число
	bin_out (M);	// сдвинутое на 4 разряда
}

но, как ты уже догадался, код сдвигает 4-хбайтовое числа (long), но не 4-хбайтовый массив. Тут нужно как-то посильней извратиться

Исправлено Fatboy (02.11.06 13:46)

Offline

#10  02.11.06 12:21

Igo
Профиль

Re: [C]Циклический сдвиг на n-бит

ага... спасибо всем за советы и за информацию - буду пытатся это все реализовать

Offline

#11  02.11.06 13:41

Re: [C]Циклический сдвиг на n-бит

unsigned long left_cycle_shift (unsigned long x, int n) 
// x - число, n - на сколько разрядов сдвинуть
{
    int  nbits = sizeof(x) * 8; // общее число бит в Х (для long это 32)
    return (x >> n) + (x << (nbits - n));
}

Это, однако, сдвиг вправо, а не влево.

Offline

#12  02.11.06 13:46

Re: [C]Циклический сдвиг на n-бит

действительно, проглядел )
fixed

Offline

Программирование и БД » [C]Циклический сдвиг на n-бит 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.045 сек.
Выполнено 14 запросов.