sanningstabell => C-kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: sanningstabell => C-kod

Inlägg av E85 »

Ja om man kör på en 3GHz PC så förstår jag inte riktigt varför tråden ens finns. Jag trodde "Mikroprocessor"-avdelningen var främst för mindre saker. Isåfall kan väl nån admin lägga till det i "PIC, Basic stamp, AVR m.m."
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: sanningstabell => C-kod

Inlägg av sodjan »

Skit samma, min poäng var att det inte fanns någonting om "target" i frågan,
så det går inte att göra några speciella antaganden om det heller. Det är ju
väldigt stora skillnader på de miljöer som skulle kunna passa i denna kategori.
Det skulle kunna vara både 8, 16 och 32 bitars miljö som är aktuellt.

Slutligen, om detta nu faktiskt är så väldigt kritiskt så får man köra igenom
några olika alternativ i den aktuella kompilatorn (det beror ju även på hur den
fungerar, inte bara på processormiljön) och kontrollera assembler resultatet.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

Så här kanske, typ

Kod: Markera allt

y=a<<1+b<<2+c<<3;

if  (( 4 == y ) || ( 12 == y ) || ( 14 == y ))
	{

	// Do whatever
	}
Användarvisningsbild
ErikJ
Inlägg: 36
Blev medlem: 17 september 2004, 16:06:53
Ort: Malung

Re: sanningstabell => C-kod

Inlägg av ErikJ »

jesse skrev:

Kod: Markera allt

if (C && B || B && !A) { sats; };
Det inte går att förenkla vidare så att B bara finns med en gång?

Kod: Markera allt

if ( B && (C || !A) )
Användarvisningsbild
4kTRB
Inlägg: 20702
Blev medlem: 16 augusti 2009, 19:04:48

Re: sanningstabell => C-kod

Inlägg av 4kTRB »

Här är några olika alternativ Logic Friday presenterar...
  • Entered by truthtable:
    F0 = A' B C' + A' B C + A B C;

    Minimized:
    F0 = A' + B C;

    Minimized Product of Sums:
    F0 = (B)(A'+C);

    Factored:
    F0 = B C + A';
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: sanningstabell => C-kod

Inlägg av jesse »

Jag et inte vad ni tolkar in i begreppet "enkelt" men jag menar:

A) läsbart: man förstår vad den gör
B) ingen onödig extra kod
C) inga onödiga variabler eller funktioner
D) gärna snabbt och kort (ur processorsynpunkt)

om man börjar med (A) faller därför en hel del märkliga förslag bort. Även Icecaps förslag försvinner då den bygger på att man måste lägga beräkningen i en separat funktion. onödigt.
sodjan skrev:> Det inte går att förenkla vidare så att B bara finns med en gång?

OK, nu hänger jag inte med alls. Är det inte så i mitt sista förslag ?
Visserligen har du bara ett B, men du har ju två C, så det blir ju inte bättre. :)

Erik J: Guld! Precis vad jag sökte. Kom faktiskt inte på det själv! :bravo:
4kTRB: Perfekt. Tre varianter av minimerad kod! Tackar. :bravo:

(edit: OK, det var inte C-kod, men formlerna duger utmärkt. bara att översätta:
// F0 = A' + B C
if (!A || (B && C))

// F0 = (B)(A'+C)
if (B && (!A || C))

// F0 = B C + A'
if ( (B && C) || !A )
Jag är mycket nöjd med detta.
E85 skrev:

Kod: Markera allt

if (C && B || B && !A) { sats; };
Du får nog jobba lite på prioritetsordningen där...
fast... && beräknas väl alltid före || precis som * går före + ?

(EDIT: ändrade ett skrivfel)
Senast redigerad av jesse 23 mars 2010, 14:02:32, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

A) läsbart: man förstår vad den gör
Det är ju en fördel, dock med en massa komplicerade saker i IF-satsen, så minskar läsbarheten
B) ingen onödig extra kod
Inte helt ovanligt att det blir kompaktare och snabbare med extra kod
C) inga onödiga variabler eller funktioner
Se ovan
D) gärna snabbt och kort (ur processorsynpunkt)
Vad som är kort och snabbt beror helt på Kompilatorn, då de tenderar att vara olika duktiga på att utnyttja procesorns inneboende kapacitet.
Det som kompilerar till 2-3 rader maskinkod på den ena kompilatorn kan bli en hel drös på en annan.
Man får prova olika alternativ och se vad som händer med resultatet.

"IF" satsen jag skrev kompilerar till 9 instruktioner på en PIC18
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: sanningstabell => C-kod

Inlägg av jesse »

ja, du har säkert bättre koll än jag på hur man skriver optimerad kod, men ditt förslag var ändå av typen "svårtolkat", tycker jag. Man fattar ju inte varför man först ska börja shifta bitar hit och dit och addera, för att sedan göra jämförelser på summan... Hade jag skrivit mycket sådan kod i mina stora program hade det varit hopplöst att gå tillbaks när det ska modifieras senare.

Jag tror ändå att if (!A || (B && C)) ger kortaste koden.
Eller kanske if( (~A | (B & C) & 1) går fortare / ger mindre kod?
Senast redigerad av jesse 22 mars 2010, 19:32:11, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

Säkert så, det är bara att testa olika alternativ och se vilken som genererar bästa koden.
Användarvisningsbild
Icecap
Inlägg: 26636
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: sanningstabell => C-kod

Inlägg av Icecap »

if ((C && B) || (B && !A)) { sats; };

Kan förkortas lite:
if(B) if(C || !A) {satsen};
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

Bara för att man skriver kompakt C-kod, betyder inte det nödvändigtvis att resultatet blir kompaktare.
Nerre
Inlägg: 27207
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: sanningstabell => C-kod

Inlägg av Nerre »

Alltså, snackar inte folk om hela olika saker här?

En del skriver kod som fungerar som ett logiskt uttryck, och alltså returnerar 1 eller 0. Men det var ju inte det TS ville ha, han ville väl ha en "if-sats" som kör något vid vissa kombinationer av villkoren?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

Jovisst, och det finns ett antal olika förslag, dock ville TS att den genererade koden skall bli så kompakt som möjligt
Användarvisningsbild
4kTRB
Inlägg: 20702
Blev medlem: 16 augusti 2009, 19:04:48

Re: sanningstabell => C-kod

Inlägg av 4kTRB »

Om resultatet finns som 1 eller 0 så är det väl ingen nackdel?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sanningstabell => C-kod

Inlägg av TomasL »

En del skriver kod som fungerar som ett logiskt uttryck
Naturligtvis, i en IF-sats ingår alltid ett logiskt uttryck, och det är ju det som är intressant.
Skriv svar