23. november 2008 - 21:57
Der er
5 kommentarer og
1 løsning
shifte bit fra 1 char ind i en anden char
Jeg har et array som følger:
unsigned char førArray[9] =
{
0x04, 0xAA, 0x20,
0x04, 0xAA, 0x20,
0x04, 0xAA, 0x20
}
Jeg skal have shiftet data mod højre eller mod venstre.
Jeg tænker en funktion ala denne :
void shift( numberOfShifts = 4, _from* = førArray, _to* = efterArray, arraySize = 9, retning = LEFT)
{
for ( 0 to arraySize )
shift _from[n+0] numberOfShifts mod retning
}
der giver dette resultat
unsigned char efterArray[9] =
{
0x4A, 0xA2, 0x00,
0x4A, 0xA2, 0x00,
0x4A, 0xA2, 0x00
}
Det største tal der kan benyttes er 16 bit langt pga. hardware
Der skal ALDRIG shiftes mere end 8 bit
23. november 2008 - 22:15
#1
Prøv med den her kode:
#include <stdio.h>
enum dir { R, L };
void shift(int bits, unsigned char *from, unsigned char *to, int n, enum dir rl)
{
int i;
if(rl == L)
{
for(i = 0; i < n; i++)
{
to[i] = (from[i] << bits) | ((i < n-1 ? from[i+1] : 0) >> (8 - bits));
}
}
else
{
for(i = 0; i < n; i++)
{
to[i] = (from[i] >> bits) | ((i >= 0 ? from[i-1] : 0) << (8 - bits));
}
}
}
int main()
{
int i;
unsigned char before[9] = { 0x04, 0xAA, 0x20, 0x04, 0xAA, 0x20, 0x04, 0xAA, 0x20 };
unsigned char after[9];
unsigned char afterafter[9];
for(i = 0; i < 9; i++) printf(" %02x", before[i]);
printf("\n");
shift(4, before, after, 9, L);
for(i = 0; i < 9; i++) printf(" %02x", after[i]);
printf("\n");
shift(4, after, afterafter, 9, R);
for(i = 0; i < 9; i++) printf(" %02x", afterafter[i]);
printf("\n");
return 0;
}