Sida 2 av 3

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 15:48:50
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."

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 15:59:29
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.

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 16:05:50
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
	}

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 16:18:10
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) )

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 16:21:42
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';

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 17:45:17
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)

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 18:29:03
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

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 19:27:37
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?

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 19:32:00
av TomasL
Säkert så, det är bara att testa olika alternativ och se vilken som genererar bästa koden.

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 19:32:21
av Icecap
if ((C && B) || (B && !A)) { sats; };

Kan förkortas lite:
if(B) if(C || !A) {satsen};

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 19:42:43
av TomasL
Bara för att man skriver kompakt C-kod, betyder inte det nödvändigtvis att resultatet blir kompaktare.

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 21:52:03
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?

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 22:52:50
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

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 23:16:33
av 4kTRB
Om resultatet finns som 1 eller 0 så är det väl ingen nackdel?

Re: sanningstabell => C-kod

Postat: 22 mars 2010, 23:38:23
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.