sanningstabell => C-kod
Re: sanningstabell => C-kod
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
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.
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
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
jesse skrev:Det inte går att förenkla vidare så att B bara finns med en gång?Kod: Markera allt
if (C && B || B && !A) { sats; };
Kod: Markera allt
if ( B && (C || !A) )
Re: sanningstabell => C-kod
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
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.
Erik J: Guld! Precis vad jag sökte. Kom faktiskt inte på det själv!
4kTRB: Perfekt. Tre varianter av minimerad kod! Tackar.
(edit: OK, det var inte C-kod, men formlerna duger utmärkt. bara att översätta:
(EDIT: ändrade ett skrivfel)
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.
Visserligen har du bara ett B, men du har ju två C, så det blir ju inte bättre.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 ?

Erik J: Guld! Precis vad jag sökte. Kom faktiskt inte på det själv!

4kTRB: Perfekt. Tre varianter av minimerad kod! Tackar.

(edit: OK, det var inte C-kod, men formlerna duger utmärkt. bara att översätta:
Jag är mycket nöjd med detta.// F0 = A' + B C
if (!A || (B && C))
// F0 = (B)(A'+C)
if (B && (!A || C))
// F0 = B C + A'
if ( (B && C) || !A )
fast... && beräknas väl alltid före || precis som * går före + ?E85 skrev:Du får nog jobba lite på prioritetsordningen där...Kod: Markera allt
if (C && B || B && !A) { sats; };
(EDIT: ändrade ett skrivfel)
Senast redigerad av jesse 23 mars 2010, 14:02:32, redigerad totalt 1 gång.
Re: sanningstabell => C-kod
Det är ju en fördel, dock med en massa komplicerade saker i IF-satsen, så minskar läsbarhetenA) läsbart: man förstår vad den gör
B) ingen onödig extra kod
Inte helt ovanligt att det blir kompaktare och snabbare med extra kod
Se ovanC) inga onödiga variabler eller funktioner
Vad som är kort och snabbt beror helt på Kompilatorn, då de tenderar att vara olika duktiga på att utnyttja procesorns inneboende kapacitet.D) gärna snabbt och kort (ur processorsynpunkt)
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
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?
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.
Re: sanningstabell => C-kod
Säkert så, det är bara att testa olika alternativ och se vilken som genererar bästa koden.
Re: sanningstabell => C-kod
if ((C && B) || (B && !A)) { sats; };
Kan förkortas lite:
if(B) if(C || !A) {satsen};
Kan förkortas lite:
if(B) if(C || !A) {satsen};
Re: sanningstabell => C-kod
Bara för att man skriver kompakt C-kod, betyder inte det nödvändigtvis att resultatet blir kompaktare.
Re: sanningstabell => C-kod
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?
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
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
Naturligtvis, i en IF-sats ingår alltid ett logiskt uttryck, och det är ju det som är intressant.En del skriver kod som fungerar som ett logiskt uttryck