www.oyunyapimi.org :: Başlığı Görüntüle - N Boyutlu İki Diziyi Toplamak..
Önceki başlık :: Sonraki başlık
Yazar
Mesaj
DG Kayıt: Mar 06, 2004 Mesajlar: 351 Nereden: Eskişehir
Tarih: Sat Aug 27, 2005 4:10 pm Mesaj konusu: N Boyutlu İki Diziyi Toplamak..
Soru:
Alıntı:
Consider the problem of adding two n-bit binary integers, stored in two n-element arrays A
and B. The sum of the two integers should be stored in binary form in an (n + 1)-element
array C. State the problem formally and write pseudocode for adding the two integers.
Uygulama:
Kod:
void ikiliTopla(int A[], int B[], int C[], int n)
{
int basamakToplami;
*C = 0;
while(n-- > 0)
{
basamakToplami = A[n] + B[n] + *C;
C[n+1] = basamakToplami % 2;
*C = ( (basamakToplami >= 2) ? 1 : 0 );
}
}
----------------------------------------------
Hiç ASM'ye bulaştırmadan daha verimli bir algoritma tavsiyesinde bulunabilecek olan var mı? "Gerçek programcılar"dan yanıt bekliyorum
Başa dön
MD-C Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Sat Aug 27, 2005 6:34 pm Mesaj konusu: Algoritma budur!
Daha iyisini yapana kadar en iyisi bu!
Alıntı:
// int *BinaryAdd(int A[], int B[], int C[], long int lenght
// Dopla.h
// Daha iyisini yazana helal olsun
// Copyright (C) 2005 MD.C
// A[] = 0 0 1 1
// B[] = 0 0 0 1
// C[] = 0 1 1 1
// Durumu için... tanımlanır!
//#define TOPLA
#ifndef TOPLA
#define _ESITLE *C = 0
#else
#define _ESITLE *C
#endif
int *BinaryAdd(int A[], int B[], int C[], long int lenght) {
while(lenght--) {
C[lenght+1] = (int)(_ESITLE || (*C = A[lenght] || B[lenght]));
}
return C;
}
Başa dön
leblebi Kayıt: Jan 05, 2004 Mesajlar: 127 Nereden: q3dm17
Tarih: Mon Aug 29, 2005 4:55 pm Mesaj konusu: ...
Optimizasyon acisindan soruyosan (x%2) operatorunu kullanmak seni oldurur onun yerine (x&1) daha hizli olacaktir.
Algoritma olarak faydasi olur mu hic bi fikrim yok ama hardware erslerinden hatirladigim kadariyla propagate-generate diye bi olay vardi, wikipedia da anlatiyo;
[url]http://en.wikipedia.org/wiki/Adder_(electronics)[/url]
Dedigim gibi ucuk bi fikir, faydasi olur mu bilemem. Buyuk ihtimalle farkli pipelinelardan kodlarsan faydasi olur ki o da ASM'ye girmek oluyo.
MD-C:
// A[] = 0 0 1 1
// B[] = 0 0 0 1
// C[] = 0 1 1 1
Eger bu dogruysa ben soruyu yanlis anladim.
Başa dön
DG Kayıt: Mar 06, 2004 Mesajlar: 351 Nereden: Eskişehir
Tarih: Mon Aug 29, 2005 5:47 pm Mesaj konusu: Re: ...
leblebi demiş ki:
MD-C:
// A[] = 0 0 1 1
// B[] = 0 0 0 1
// C[] = 0 1 1 1
Eger bu dogruysa ben soruyu yanlis anladim.
MD-C bilerek yanlış algoritma geçti burada. Millet dener de, "bu algoritma yanlış" der mi diye Ama "gerçek programcılar"dan hiç ses seda çıkmadı
Kod:
Optimizasyon acisindan soruyosan (x%2) operatorunu kullanmak seni oldurur onun yerine (x&1) daha hizli olacaktir.
Bit-wise tamamen aklımdan çıkmıştı sağolasın, o zaman aşağıyı da "*C = ( (basamakToplami & 2) ? 1 : 0 );" şeklinde değiştirdim.
Başa dön
leblebi Kayıt: Jan 05, 2004 Mesajlar: 127 Nereden: q3dm17
Tarih: Mon Aug 29, 2005 6:41 pm Mesaj konusu: ...
Alıntı:
Bit-wise tamamen aklımdan çıkmıştı sağolasın, o zaman aşağıyı da "*C = ( (basamakToplami & 2) ? 1 : 0 );" şeklinde değiştirdim.
Yok abi onu
Kod:
*C = basamakToplami >> 1;
seklinde yapman lazim(ikinci bit'e bakicaksin)
Tabii ki burda farzettim ki basamakToplami 2'den fazla olamaz, aksi takdirde yine & lemek lazim olacakti.
[/code]
Başa dön
DG Kayıt: Mar 06, 2004 Mesajlar: 351 Nereden: Eskişehir
Tarih: Mon Aug 29, 2005 7:04 pm Mesaj konusu: Re: ...
leblebi demiş ki:
Alıntı:
Bit-wise tamamen aklımdan çıkmıştı sağolasın, o zaman aşağıyı da "*C = ( (basamakToplami & 2) ? 1 : 0 );" şeklinde değiştirdim.
Yok abi onu
Kod:
*C = basamakToplami >> 1;
seklinde yapman lazim(ikinci bit'e bakicaksin)
Tabii ki burda farzettim ki basamakToplami 2'den fazla olamaz, aksi takdirde yine & lemek lazim olacakti.
[/code]
Basamak toplamı 3 olabilir, ama yine de senin kod çalışır.
Teşekkürler.
Başa dön
leblebi Kayıt: Jan 05, 2004 Mesajlar: 127 Nereden: q3dm17
Tarih: Mon Aug 29, 2005 8:07 pm Mesaj konusu: ...
Haklisin, 3'den fazla demek isteyip 2 yazmisim. Anlamissin ama derdimi.
Başa dön
khalim Kayıt: Nov 27, 2004 Mesajlar: 4
Tarih: Mon Aug 29, 2005 10:14 pm Mesaj konusu:
int n;
int a[] = {1,0,0,1,1,1,1,1};
int b[] = {1,0,0,1,1,1,1,1};
int c[] = {0,0,0,0,0,0,0,0,0};
main(){
for(n=7; n>-1; n--)
{
c[n+1] = c[n+1] ^ (a[n] ^ b[n]);
c[n] = a[n] & b[n];
}
Başa dön
leblebi Kayıt: Jan 05, 2004 Mesajlar: 127 Nereden: q3dm17
Tarih: Tue Aug 30, 2005 3:29 am Mesaj konusu: ...
...and the oscar goes toooo... khalim!
Başa dön
wisecode_g Kayıt: Jul 29, 2005 Mesajlar: 17 Nereden: istanbul
Tarih: Tue Oct 04, 2005 3:29 pm Mesaj konusu:
basamakToplami = A[n] + B[n] + *C;
//yerine
basamakToplami =*A(n*sizeof(int))+*B(n*sizeof(int))+*C;
//yapsak daha hızlı çalışmazmı??
Başa dön
Bu forumda yeni konular açamazsınız Bu forumdaki mesajlara cevap veremezsiniz Bu forumdaki mesajlarınızı değiştiremezsiniz Bu forumdaki mesajlarınızı silemezsiniz Bu forumdaki anketlerde oy kullanamazsınız
Powered by phpBB 2.x.x © 200x phpBB Group Türkçe Çeviri : Onur Turgay & Erdem Çorapçıoğlu Türkçe Düzenleme: Alexis Canver
Version 2.x.x of PHP-Nuke Port by Tom Nitzschner © 200x www.toms-home.com