Operacja modulo

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Czy jest inny sposób niż operator %? Jak wiadomo, to jest wolne, a potrzebuje "wyciągnąć" z liczby kazdą jej cyfre.


do not code, write prose
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
2
Kopiuj
unsigned value=?;
for(unsigned i=0;(value)||(!i);++i)
  {
   unsigned next=value/10;
   buf[i]=value-10*next;
   value=next;
  }

Nie ma % ale dzielenie zostało.
Jeżeli "cyfry" są dziesiętne to nie ma innego sposobu. Lecz jeżeli cyfry są w systemie który jest potęgą dwójki: 2,4,8,16 to da się obejść samymi operacjami bitowymi, dodawanie, odejmowanie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Ola Nordmann
Modulo na pewno nie będzie szybsze od tego?
_13th_Dragon
od minus z mnożeniem - na 100%
Ola Nordmann
Aż mnie zastanawia jak wygląda modulo w asm. Muszę sobie gdzieś zapisać, żeby sprawdzić.
Ola Nordmann
tak, ale głębiej ;) Dlaczego będzie wolniejsze od odejmowania i mnożenia.
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Tak przy okazji - nie chce zakładac nowego tematu dla jakiejs glupoty. jak zapisać to w jednej linijce?

Kopiuj
char *wsk;
wsk = (char *) wynik;

do not code, write prose
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
0
Kopiuj
char *wsk=wynik; //powinno wystarczyć

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0
Kopiuj
błąd:cannot convert 'bool*' to 'char*' in initialization
 char *wsk = wynik;
             ^

No tak, zapomnialem dodać, ze wynik to bool i stąd to rzutowanie.
EDIT: już wiem ;)


do not code, write prose
edytowany 2x, ostatnio: pingwindyktator
hauleth
To tak samo tylko dodaj rzutowanie.
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
2

Jak widzę z innych tematów nie zrozumiałeś na czym polega przyspieszenie.
Same operacje % i / to jest dokładnie ta sama operacja i jest długa.
Przeważnie przy przekształceniu na inny system lub przy "ręcznym" mnożeniu robimy obie operacje pod rząd:

Kopiuj
Cyfra[i]=wynik%MOD;
wynik/=MOD;

To co pokazałem w tym temacie pozwala na wyeliminowanie jednej z tych operacji:

Kopiuj
next=wynik/MOD;
Cyfra[i]=wynik-next*MOD;
wynik=next;

Natomiast to co zacząłeś używać:

Kopiuj
Cyfra[i]=wynik-MOD*(wynik/MOD);
wynik/=MOD;

jest z cała pewnością dłuższe od pierwotnego kodu


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 3 komentarze
_13th_Dragon
@Shalom, kompletnie zapomniałem że znasz jedyny słuszny kompilator, z jedynymi słusznymi ustawieniami ;P
Shalom
A znasz kompilator który tego nie zoptymalizuje? (o ile mu nie wyłączysz wyszstkich optymalizacji ;]) Sam taki dziergasz gdzieś na boku? ;)
kq
Co do kompilatora, na szybko sprawdziłem clanga, gcc i icc - wszystkie bezproblemowo sobie z tym radziły. ( http://goo.gl/jHYc5V ) Nie wierzę, że w przypadku msvc jest inaczej, więc myślę, że śmiało można twierdzić, że każdy liczący się kompilator to obsługuje. Co do wywoływania drugiego dzielenia wewnątrz funkcji - widząc ten temat nie bardzo mamy to skąd wywnioskować.
_13th_Dragon
@Shalom i @kq , odsyłam do postu http://4programmers.net/Forum/C_i_C++/226139-silnia_duzych_liczb_-_brak_wywolania_funkcji?p=994632#id994632 gdzie w komentarzach podano: http://ideone.com/eK3jaU gdzie trzeba obczaić funkcje mod() oraz jej wywołanie. Po czym proszę tu w komentarzach opisać ten problem tak aby nawet tacy czepialscy jak wy zrozumieli o co biega ;P
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 13 godzin
0

Czy jest inny sposób niż operator %? Jak wiadomo, to jest wolne, a potrzebuje "wyciągnąć" z liczby kazdą jej cyfre.
Robisz miliard takich operacji na sekundę, że ci jest za wolne?

SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 godziny
0

A może by ją na string-a przerobić?

ŁF
Przecież zrzucenie liczby do stringa nie robi się magicznie - w środku odpowiedniej metody jest pętla z dzieleniem.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 13 godzin
0
zonkoo22 napisał(a)
Azarien napisał(a)

Robisz miliard takich operacji na sekundę, że ci jest za wolne?

Dokładnie tak.

No to albo asembler albo przemyśl cały algorytm. Albo szybszy komputer.

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 10 godzin
0
Azarien napisał(a):
zonkoo22 napisał(a)
Azarien napisał(a)

Robisz miliard takich operacji na sekundę, że ci jest za wolne?

Dokładnie tak.

No to albo asembler albo przemyśl cały algorytm. Albo szybszy komputer.

Albo wielowątkowość - na pewno wyjdzie taniej, niż szybszy procesor/pamięć.


Endrju
Dodatkowo polecam SIMD jeżeli się da.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.