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

Rzutowanie tablicy na zmienną.

Ostatnio zmodyfikowano 2015-10-16 20:51
Autor Wiadomość
Piastlis
Temat założony przez niniejszego użytkownika
Rzutowanie tablicy na zmienną.
» 2015-10-08 12:49:15
Przechowuję liczbę w tablicy unsigned long, ale obliczenia wykonuję na liczbach unsigned long long.Jak na razie poradziłem sobie tworząc pomocniczą unię ale ten sposób nie wydaje mi się zbyt elegancki.
C/C++
void mnoz( unsigned long cel[], unsigned long mnozna[], unsigned long long mnoznik )
{
    union L_p
    {
        unsigned long long l64;
        unsigned long wynik[ 2 ];
    };
    union L_p pom = { 0 };
   
    for( unsigned long k = 1; k <= mnozna[ 0 ]; k++ )
    {
        pom.l64 = pom.wynik[ 1 ] + mnozna[ k ] * mnoznik;
        cel[ k ] = pom.wynik[ 0 ];
    }
   
    if( pom.wynik[ 1 ] == 0 )
    {
        cel[ 0 ] = mnozna[ 0 ];
    }
    else
    {
        cel[ 0 ] = mnozna[ 0 ] + 1;
        cel[ cel[ 0 ] ] = pom.wynik[ 1 ];
        cel[ cel[ 0 ] + 1 ] = 0;
    }
   
}

P-138269
pekfos
» 2015-10-08 14:31:14
Liczby możesz łączyć operacjami bitowymi.
P-138271
mateczek
» 2015-10-08 14:38:11
a co stoi na przeszkodzie w normalnym działaniu??
C/C++
#include <iostream>
#include<string>
using namespace std;

int main() {
    unsigned long tab[ 1 ];
    unsigned long long a = 15, b = 15;
    tab[ 0 ] = a *= b;
    cout << tab[ 0 ] << endl;
}
ta unia w sposób jaki działa i tak zgubi połowę liczby przy zapisie do tablicy (gdy zakres niewystarczy!!! )
P-138274
Piastlis
Temat założony przez niniejszego użytkownika
» 2015-10-08 19:35:29
Unia działa dobrze.Jak pomnożę 2 liczby 32 bitowe to mam 1 liczbę 64 bitową.32 bity wyniku i 32 bity przeniesienia który dodajesz do następnego wyniku mnożenia.Unię stosuję po to by nie dzielić lub przesuwać binarnie 64 bitowego wyniku by uzyskać przeniesienie.Można się bez niej obejść ale najlepszym rozwiązaniem byłoby bezpośrednie wpisanie 64 bitowego wyniku do dwóch kolejnych liczb 32 bitowych.
Coś w stylu:
C/C++
for( unsigned long k = 1; k <= mnozna[ 0 ]; k++ )
     cel[ k..k + 1 ] = cel[ k ] + mnozna[ k ] * mnoznik;

 Nie byłoby potrzeby stosowania żadnych zmiennych pomocniczych.
P-138286
Rashmistrz
» 2015-10-08 19:54:46
W języku asemblera nie ma takiego cackania się.
Jak się tam mnoży to wynik jest rozłożony na
dwa rejestry po prostu...
P-138287
Piastlis
Temat założony przez niniejszego użytkownika
» 2015-10-08 20:04:10
Wiem.Myślę że nie ja pierwszy o tym pomyślałem i jest już gotowe rozwiązanie:)


Poprawna konstrukcja to :

C/C++
for( unsigned long k = 1; k <= mnozna[ 0 ]; k++ )
     *( unsigned long long * ) & cel[ k ] = cel[ k ] + mnozna[ k ] * mnoznik;

Nie wiem dlaczego ale jest ona ok. 30% wolniejsza od tej z unią.
P-138288
C-Objective
» 2015-10-15 17:12:00
C/C++
char * zmienna;
char tablica[] = { "Tabliczka" };
zmienna = tablica;
I bez rzutowania.
P-138614
Piastlis
Temat założony przez niniejszego użytkownika
» 2015-10-16 20:51:21
A tak np. z rzutowaniem:
 
C/C++
*( unsigned long long * ) zmienna ^= 0x2020202020202020;
 Przykład ze zmianą wielkości znaku w 8 char za jednym razem jest może trywialny ale taki zapis jest użyteczny gdy potrzeba przetworzyć arytmetycznie ,bitowo lub logicznie duże dane.
P-138693
« 1 »
  Strona 1 z 1