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.
Rozumiem, że nawet Ci się nie chciało rzucić okiem na Wikipedię, która ma gotowy kod w C do konwersji?
void bin2gray(char *s) { char *p=s+strlen(s)-1; while(sp) { *p^=1*(p-1); --p; } }
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
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
A ma ktoś pomysł na krótszy i szybszy sposób?
pozdrawiam
O wiele krótszy, o wiele szybszy a co najważniejsze - poprawny.
unsigned long long bin2gray(unsigned long long V) { return V^(V1); }
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?
for(int i=0;i<(1<<10);++i) if(mojgray(i)!=twojgray(i)) std::cout<<"err i="<<i<<endl; [/code]
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…
w gray2bin - V - na starcie jest gray na końcu bin