Написать макрос, реализующих циклические перестановки (влево-вправо) на k бит, первых n бит, 32-хбитовоц структуры (unsigned).Обьясните ктонибудь что за циклические перестановки ?Ато я никак не могу врубиться
#define SDVIG(s,n,c) (c=='L'? s=(s<<n)|(s>>32-n):c=='R'? s=(s>>n)|(s<<32-n):printf("ERROR:'%c'",c))Правильно я реализовал требуемый макрос?
Стой, стой... Не так... Я сразу не очень внимательно прочел задание...
Тебе надо не просто циклически сдвинуть число на сколько-то бит, тебе надо сдвинуть N первых бит числа циклически на K бит. То есть, если возьмем N = 5, K = 3 и 32-битное число s:
00110101 00001010 00000000 000000002 = (13578 * 65536)10
(для простоты я рассматриваю только первые 16 бит, остальные пусть будут нулевыми, это как раз и даст умножение на 216 = 65536), то "зацикливать" надо только первые 5 бит, остальные должны остаться на своих местах, т.е., результат будет:
XXXXX101 00001010 00000000 000000002, где выделенный фрагмент - это N (5 этом случае) бит 00110, сдвинутые циклически на K (т.е, на 3) :
было 00110
стало 10001
Итого получаем:
10001101 00001010 00000000 000000002 = (36106 * 65536)10...
Теперь другое. Не стОит сразу бросаться и писать макросы. Их очень сложно отлаживать, поэтому сначала пишется программка, в которой это все делается без макросов, обычным способом:
#include <stdio.h>Как видишь, получилось именно 36106, значит, фрагмент работает правильно. Сделай аналогичные преобразования для сдвига вправо, чтоб оно работало правильно, а потом уже преобразуй в макрос...
int main() {
unsigned int T;
char c = 'L';
unsigned s = 13578 * 65536;
int n = 5, k = 3;
if(c == 'L') {
T = s & ((0xffffffff >> (32 - n)) << (32 - n));
T = (T << k) | (T >> (n - k));
s = T | (s & (0xffffffff >> n));
}
printf("%u", s / 65536);
return 0;
}
#include <stdio.h>Как видишь, получилось именно 36106, значит, фрагмент работает правильно. Сделай аналогичные преобразования для сдвига вправо, чтоб оно работало правильно, а потом уже преобразуй в макрос...
int main() {
unsigned int T;
char c = 'L';
unsigned s = 13578 * 65536;
int n = 5, k = 3;
if(c == 'L') {
T = s & ((0xffffffff >> (32 - n)) << (32 - n));
T = (T << k) | (T >> (n - k));
s = T | (s & (0xffffffff >> n));
}
printf("%u", s / 65536);
return 0;
}
Все написал макрос работает правильно!!!Спасибо!
#define L(s,n,k) s=((((s & ((0xffffffff >> (32 - n)) << (32 - n)))<<k)|((s & ((0xffffffff >> (32 - n)) << (32 - n)))>>(n-k)))| (s & (0xffffffff >> n)))
#define R(s,n,k) s=((((s & ((0xffffffff << (32 - n)) >> (32 - n)))>>k)|((s & ((0xffffffff << (32 - n)) >> (32 - n)))<<(n-k)))| (s & (0xffffffff << n)))
...Чему должен быть равен результат?
int main() {
unsigned s = 13578 * 65536;
int n = 7, k = 4;
R(s, n, k);
printf("%u", s / 65536);
return 0;
}