sanningstabell => C-kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

sanningstabell => C-kod

Inlägg av jesse »

jag har tre booleska variabler, A, B och C (egentligen unsigned char).

På grund om dessa är sanna eller falska (1 eller 0) så skall resultatet bli:

Kod: Markera allt

A B C     X
0 0 0     x
0 0 1     x
0 1 0     1
0 1 1     1
1 0 0     0
1 0 1     0
1 1 0     0
1 1 1     1
Egentligen ska "svaret" inte vara i form av en variabel utan skall vara del i en if-sats där en sats utförs om X = 1.

Hur formulerar jag denna funktion effektivast i C ?

(då A och B båda är noll är resultatet irrelevant eftersom denna situation ej kan uppstå, därför ett "x" i resultatet)
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 »

En "brute force" lösning är ju enkel att fixa, men du kanske
var mer ute efter en smart lösning (om det finns någon...) ?

Kod: Markera allt

if ( (!A and B and !C) or  (!A and B and C) or (A and B and C) )
    do-something;
else
    do-something-else;
Kan nog förenklas till :

Kod: Markera allt

if ( (!A and B and !C) or  (B and C) )
    do-something;
else
    do-something-else;
Om både B och C är "1" så ska det ju det hela vara sant...

Även detta borde fungera :

Kod: Markera allt

if ( (!A and !C) or  (B and C) )
    do-something;
else
    do-something-else;
Om både A och C = "0" så spelar inte B någon roll...
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: sanningstabell => C-kod

Inlägg av E85 »

x = (a & b & c) | (~a & b);

Nånting sånt kanske. Har inte provat det och var ett tag sen jag programmerade C men principen borde vara rätt.
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 »

har tänkt lite grann och tror att detta kanske är den enklaste lösningen, (om jag nu inte gjort fel):

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?
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: sanningstabell => C-kod

Inlägg av E85 »

Du får nog jobba lite på prioritetsordningen där men det är sant att A inte behöver vara med i första som jag gjorde...
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 »

> 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 ?
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: sanningstabell => C-kod

Inlägg av Icecap »

Kod: Markera allt

if(!A)
  {
  return(B);
  }
else
  {
  if(B && C) return(true);
  else return(false);
  }
Användarvisningsbild
4kTRB
Inlägg: 20702
Blev medlem: 16 augusti 2009, 19:04:48

Re: sanningstabell => C-kod

Inlägg av 4kTRB »

Nu var det längesedan jag skrev program i C men det här får jag som resultat
när Logic Friday genererar C-kod...

Kod: Markera allt

/*
 lookup.c
 Generated by Logic Friday on Mon Mar 22 15:15:51 2010
*/

int lu_F0( int A, int B, int C );

int lu_F0( int A, int B, int C )
{
	const unsigned int nOutAry[] =
	{0XF1000000};

	unsigned int nTerm=0, nX, nBit;

	if( A ) nTerm |= 1<<2;
	if( B ) nTerm |= 1<<1;
	if( C ) nTerm |= 1;
	nX = nTerm / 32;
	nBit = 31 - nTerm % 32;
	if( nOutAry[nX] & 1<<nBit )
		return 1;
	else
		return 0;
}
Kan det verka rimligt?


Ett annat alternativ...

Kod: Markera allt

/*
 lookup.c
 Generated by Logic Friday on Mon Mar 22 15:19:42 2010
*/

int lu_F0( unsigned int nTerm );

int lu_F0( unsigned int nTerm )
{
	const unsigned int nOutAry[] =
	{0XF1000000};

	unsigned int nX, nBit;

	nX = nTerm / 32;
	nBit = 31 - nTerm % 32;
	if( nOutAry[nX] & 1<<nBit )
		return 1;
	else
		return 0;
}
Senast redigerad av 4kTRB 22 mars 2010, 15:20:27, redigerad totalt 1 gång.
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: sanningstabell => C-kod

Inlägg av E85 »

Nja det verkade väldigt omständigt, men icecaps förslag var nog bäst så slipper man beräkna allt varenda gång. :tumupp:
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 »

> ...så slipper man beräkna allt varenda gång.

Vad är "allt" ??
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: sanningstabell => C-kod

Inlägg av E85 »

Nu vet jag inte exakt hur asm-koden kommer se ut men antar att den kollar minst A och C varje gång i din IF-sats men i icecaps räcker det i vissa fall att bara kolla A. Men det var bara ett antagande, sorry. edit: Nu såg jag dessutom att han returnerade B så det var ju inte riktigt som jag tänkt mig... man kan likaväl returnera true där eftersom dom två första inte spelar nån roll.
Senast redigerad av E85 22 mars 2010, 15:27:22, redigerad totalt 2 gånger.
Användarvisningsbild
4kTRB
Inlägg: 20702
Blev medlem: 16 augusti 2009, 19:04:48

Re: sanningstabell => C-kod

Inlägg av 4kTRB »

Vilket kommer gå snabbast?
Andra förslaget jag kom med verkar vid en snabb granskning kunna prestera bra?
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: sanningstabell => C-kod

Inlägg av ahlsten »

Är du helt säker på det? Modulo på en mikroprocessor i inbyggt system är nog inte jättesnabbt.
Läsbarheten var inte på top heller :(
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 »

> Nu vet jag inte exakt hur asm-koden kommer se ut...

Spelar det så väldigt stor roll igentligen ?
På dagens 3 GHz PC så blir det nog ingen större skillnad.
Eller gjorde du något annat antagande om plattform ??
Det finns inget i frågan som säger något om det...

Förslagen från 4kTRB orakar jag inte ens läsa. Andra får
ha synpunkter på dom...

> Modulo på en mikroprocessor i inbyggt system är nog inte jättesnabbt.

Tja, *om* det är ett "inbyggt system" det hela handlar om...
Användarvisningsbild
4kTRB
Inlägg: 20702
Blev medlem: 16 augusti 2009, 19:04:48

Re: sanningstabell => C-kod

Inlägg av 4kTRB »

Det kan säkert stämma då koden är för 32 bits.

Motsvarande för 8-bits kan passa bättre...

Kod: Markera allt

/*
 lookup.c
 Generated by Logic Friday on Mon Mar 22 15:36:11 2010
*/

int lu_F0( unsigned int nTerm );

int lu_F0( unsigned int nTerm )
{
	const unsigned int nOutAry[] =
	{0XF1};

	unsigned int nX, nBit;

	nX = nTerm / 8;
	nBit = 7 - nTerm % 8;
	if( nOutAry[nX] & 1<<nBit )
		return 1;
	else
		return 0;
}
Bör inte vara några problem att läsa om man dagligen mixtrar med C-kod tycker jag väl.
Skriv svar