odwracanie porządku bajtu
Ostatnio zmodyfikowano 2015-10-01 20:35
Anim Temat założony przez niniejszego użytkownika |
odwracanie porządku bajtu » 2015-10-01 08:53:48 Witajcie :) Chciałbym zamienić starszy i młodszy bajt (chyba tak to się nazywa). Tylko mam taki problem, ponieważ zmienna której ta operacja miałaby dotyczyć jest typu float. I w przypadku, gdy używam metody: unsigned char reverse( float b ) { b =( b & 0xF0 ) >> 4 |( b & 0x0F ) << 4; b =( b & 0xCC ) >> 2 |( b & 0x33 ) << 2; b =( b & 0xAA ) >> 1 |( b & 0x55 ) << 1; return b; }
wyskakuje mi błąd : " error: invalid operands of types 'float' and 'int' to binary 'operator&' ". Co mogę z tym zrobić ?... Dziękuję z góry :) |
|
mateczek |
Bajty?? czy słowa?? czy wszystko odwrócić?? » 2015-10-01 09:12:42 Float ma 4 bajty !!! a funkcja którą zaprezentowałeś chyba odwraca bity w bajcie !!! Zamiana bajtów w słowie WORD reverse( WORD b ) { b =( b & 0xFF ) >> 8 |( b & 0xFF ) << 8; return b; }
Tutaj masz rozwiązanie jednego zadania ze SPOJa skompiluj sobie i zobacz jak wygląda float !!! typedef unsigned char BYTE; #include <iostream> int main() { int liczbaT; float liczba; BYTE * temp =( BYTE * ) & liczba; int * temp2 =( int * ) & liczba; std::cin >> liczbaT; while( liczbaT ) { std::cin >> liczba; std::cout << std::hex <<( int ) *( temp + 3 ) << " " <<( int ) *( temp + 2 ) << " " <<( int ) *( temp + 1 ) << " " <<( int ) *( temp ) << std::endl; std::cout << std::hex <<* temp2 << std::endl; liczbaT--; } }
|
|
Anim Temat założony przez niniejszego użytkownika |
» 2015-10-01 09:26:49 Bo mi właśnie chodzi o zamianę bitów w bajcie. Może źle się na początku wyraziłem. |
|
Anim Temat założony przez niniejszego użytkownika |
» 2015-10-01 10:29:35 Może inaczej. Postaram się na przykładzie pokazać o co mi chodzi. Gdy wezmę coś takiego : unsigned int one; one = < zmienna typu unsigned int > & 0xFFFFFFFF; one = one << 32;
To nie wyskakują mi błędy. Jednak jestem zmuszony to samo zrobić na zmiennej typu float. Jednak wtedy wyskakuje mi błąd jak napisałem powyżej. Dlaczego ? Potrzebuję zrobić coś takiego: float two; two = < zmienna typu float > & 0xFFFFFFFF; two = two << 32;
|
|
mateczek |
» 2015-10-01 11:42:52 int main() { float two, tree; two =( unsigned int ) tree & 0xFFFFFFFF; two =( unsigned int ) two << 32; }
|
|
Monika90 |
» 2015-10-01 11:44:18 A po co chcesz odwracać kolejność bitów we float?
Jedyny sposób to skopiować do uint32_t, używając memcpy, wykonać żądaną operację i skopiować wynik z powrotem do float. |
|
mateczek |
Jeszcze napiszę » 2015-10-01 14:02:01 Pewnie wiesz ale liczby typu float są przechowywane na 4 bajtach!!! Dla przykładu 1 jako float: 00 00 80 3f - tak jest zapisana jedynka w kolejności od początku pamięci !!! 3f 80 00 00 - tak jeśli float rzucisz na int (PC ma odwrócona kolejność bajtów nie bitów!!! w stosunku do innych urządzeń np sterowników !!!)
|
|
Piastlis |
» 2015-10-01 20:35:44 @Anim..Tak łopatologicznie...Bo mieszasz pojęcia...Chcesz napisać funkcję która zamieniałaby miejsca bitów w słowie :(np 8 bitów) 0>0 1>128 2>64 3>192 ...itd I by działało to nie na char,int tylko na float? |
|
« 1 » |