Arkadalar yok size is falan. Verdiginiz cevabin saglamasini yaptiniz mi? Simdi sozu gecen dongu:
- Code: Select all
for(int i=0; i<n;i++)
a[i] *= 20;
Bunu yazmak icin bir "Introduction to Computer Programming" kitabi okumus olmak yeterli. Zaten soru bu degil, soru bunun nasil daha az CPU cycle harcar sekilde yapilacagi.
Verdiginiz cevabin bundan farki carpmayi shiftler ile yapmaniz. Haphazard ortayi kesti, siz de dokundunuz ama gol kendi kalenize :) Agir cekimde izleyelim:
Her instruction'un sonucu R0'a yazilir diyelim. SHIFT buna istisnadir; ayni register ustunde yapar islemi. ADD iki parametre alabilir. Modern islemcilerde MULT bir parametre alir, bu parametreyi R1 ile carpar.
- Code: Select all
a[i] *= 20;
satiri derleyiciden yaklasik olarak su sekilde cikar:
- Code: Select all
COPY R0,R1 //Array dereference isleminin sonucunun R0da oldugunu varsayiyorum
MULT 20
WRITE R8, R0 //Arrayin memory location'i R8 de varsayiyorum.
3 CPU cycle'da is tamam. Ayni varsayimlari kullanarak sizin cozume bir bakalim:
- Code: Select all
a[i] = (a[i] << 4) + (a[i] << 2)
- Code: Select all
COPY R0,R1 // a[i] degerini 2 kere kaydiracagim icin bir kopyasini almak zorundayim
LSHIFT R1, 4 // a[i] << 4
LSHIFT R0, 2 // a[i] << 2
ADD R0, R1
WRITE R8,R0 // array'e geri yazdik
5 CPU cycle! Hakikaten super kisaltmissiniz :) Bir de yemek falan soranlar var :)
Ipucu vereyim: think out of the box. Mulakatta kutunun icin de dusunup durdugum icin kasilmistim.