[C#] 10-bitowy konwerter z kodu gray`a na binarny


(system) #1

Witam serdecznie, poszukuję kodu programu w C,który będzie realizował zamiane liczb 10-bitowych z kodu gray`a na kod binarny. Z góry dziękuję za pomoc.


(Ryan) #2

Rozumiem, że nawet Ci się nie chciało rzucić okiem na Wikipedię, która ma gotowy kod w C do konwersji?


([alex]) #3
void bin2gray(char *s)  {   char *p=s+strlen(s)-1;   while(sp)     {      *p^=1*(p-1);      --p;     }  }

(system) #4

Mam coś troche innego:

uint16_t GrayToBinary(uint16_t gray) // funkcja przliczajaca z kodu gray`a na NKB

{                                     

   uint16_t binary;


   binary = (gray & (2^9)); //przepisujemy najstarszy bit, pozostale 0 (gray & 1000...00)

   binary |= (( gray ^ (binary>>1) ) &(2^8) ) //wyliczamy 2-gi najstarszy bit, pozostale zerujemy poprzez operacje &(2^8) czyli & 0100000000


   binary |= (( gray ^ (binary>>2) ) &(2^7) ) //wyliczamy kolejne bity

   binary |= (( gray ^ (binary>>3) ) &(2^6) )

   binary |= (( gray ^ (binary>>4) ) &(2^5) )

   binary |= (( gray ^ (binary>>5) ) &(2^4) )

   binary |= (( gray ^ (binary>>6) ) &(2^3) )

   binary |= (( gray ^ (binary>>7) ) &(2^2) )

   binary |= (( gray ^ (binary>>8) ) &(2^1) )

   binary |= (( gray ^ (binary>>9) ) &(2^0) ) //wyliczamy najmłodszy bit &0000000001


   return binary; 

}

pozniej postaram się żeby było to zrobione w pętli


([alex]) #5

Wszystko zależy od początkowej i końcowej reprezentacji, nie powiedziałeś jaka ma być.

Dla reprezentacji binarnej NKB kod który podałeś chyba nie jest najszybszym i już na pewno nie jest najkrótszy no i wreszcie

na 100% nie jest poprawny :smiley:


(system) #6

A ma ktoś pomysł na krótszy i szybszy sposób?

pozdrawiam


([alex]) #7

O wiele krótszy, o wiele szybszy a co najważniejsze - poprawny.

unsigned long long bin2gray(unsigned long long V)  {   return V^(V1);  }

(system) #8

Hmmm przejrzalem to co wyslaliscie, i napsialem cos takiego:

int GrayToBinary(int gray) {


                int binary=0;


                for (int i=0;i<=9;i++) binary |= (gray ^ (binary >> 1) )& (1<<(9-i)) ;


                return binary;


}

bedzie to dzialac?


([alex]) #9
for(int i=0;i<(1<<10);++i) if(mojgray(i)!=twojgray(i)) std::cout<<"err i="<<i<<endl; [/code]

(system) #10

Do Alex:

unsigned long long bin2gray(unsigned long long V)

  {

   return V^(V>>1);

  }


unsigned long long gray2bin(unsigned long long V,unsigned char bits=10)

  {

   unsigned long long M=1<<(bits-1);

   while(M>>=1) V^=M&(V>>1);

   return V;

  }

nie do konca wiem o co Ci chodzi, zmienna V, jest w koncu reprezentacja kodu w grey`u czy w NKB? bo na koncu zwracasz wartosc wlasnie V...


([alex]) #11

w gray2bin - V - na starcie jest gray na końcu bin