Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

odwracanie porządku bajtu

Ostatnio zmodyfikowano 2015-10-01 20:35
Autor Wiadomość
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:

C/C++
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 :)
P-138056
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
C/C++
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 !!!

C/C++
typedef unsigned char BYTE; // 1byte
#include <iostream>
int main() {
    int liczbaT; //liczba testów musisz podać lile razy będzie pytał
    float liczba;
    BYTE * temp =( BYTE * ) & liczba;
    int * temp2 =( int * ) & liczba;
    std::cin >> liczbaT;
   
    while( liczbaT ) {
        std::cin >> liczba; // a tu już podajesz liczbę by zobaczyć reprezentację w bajtach
        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--;
    }
}
P-138057
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.
P-138058
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 :

C/C++
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:

C/C++
float two;
two = < zmienna typu float > & 0xFFFFFFFF;
two = two << 32;
P-138062
mateczek
» 2015-10-01 11:42:52
C/C++
int main()
{
    float two, tree;
    two =( unsigned int ) tree & 0xFFFFFFFF; // to nic nie robi
    two =( unsigned int ) two << 32; // a to nawet nie wiem bo zmienna float ma 32 bity  więc pewnie zeruje
}
P-138064
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.
P-138065
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 !!!)

P-138069
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?
P-138081
« 1 »
  Strona 1 z 1