#1 01.11.06 23:21
[C]Циклический сдвиг на n-бит
Подскажите кто знает как осуществляется циклический сдвиг на заданное число бит на С.
Ситуация такая - надо циклически сдвинуть массив из 4 байт влево на 11 бит.
Если бы знал ассемблер - то все наверное было бы проще, но может кто подскажет - он в этой ситуации может помочь или нет?
Исправлено Igo (01.11.06 23:21)
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
#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
#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

