Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
// Циклический сдвиг целой величины
#define ROTATE_LEFT(val,n) ((unsigned long)val < < n)|((unsigned long)val > > (sizeof(val)*8-n))
#define ROTATE_RIGHT(val,n) ((unsigned long)val > > n)|((unsigned long)val < < (sizeof(val)*8-n))
Сдвигает char'ы, int'ы, long'и. Работает на ИАРе
Примеры:
unsigned long xxl,yyl = PINC+0x12345678;
unsigned int xxi,yyi = PIND+0x1234;
unsigned char xxc,yyc = PIND+0x12;
xxl = ROTATE_LEFT(yyl,28);
printf("\n%04lx %04lx\n",yyl, xxl);
xxi = ROTATE_LEFT(yyi,16);
printf("\n%04x %04x\n",yyi, xxi);
xxc = ROTATE_LEFT(yyc,4);
printf("\n%02x %02x\n",yyc, xxc);
_NOP();
_NOP();
xxl = ROTATE_RIGHT(yyl,28);
printf("\n%04lx %04lx\n",yyl, xxl);
xxi = ROTATE_RIGHT(yyi,16);
printf("\n%04x %04x\n",yyi, xxi);
xxc = ROTATE_RIGHT(yyc,4);
printf("\n%02x %02x\n",yyc, xxc);
_NOP();
_NOP();
yyc = 0x01;
yyc = ROTATE_LEFT(yyc,1);
printf("\n%02x",yyc);
yyc = ROTATE_LEFT(yyc,1);
printf("\n%02x",yyc);
yyc = ROTATE_LEFT(yyc,1);
printf("\n%02x",yyc);
yyc = ROTATE_LEFT(yyc,1);
printf("\n%02x",yyc);