Avatar billede _et Praktikant
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
Avatar billede arne_v Ekspert
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;
}
Avatar billede arne_v Ekspert
23. november 2008 - 22:16 #2
Den forudsætter 8 bit per char. Og jeg har ikke testet den super grundigt.
Avatar billede segmose Nybegynder
24. november 2008 - 10:57 #3
Shift eller rotate?
Avatar billede _et Praktikant
24. november 2008 - 11:22 #4
det er rent shift
Avatar billede _et Praktikant
02. december 2008 - 18:07 #5
Det virker perfekt.

kom med et svar.
Avatar billede arne_v Ekspert
02. december 2008 - 18:37 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester