Forum: PC-Programmierung C Wert auf 0 oder 1 reduzieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Guten Tag (Gast)


Bewertung
-6 lesenswert
nicht lesenswert
Guten Tag

Mich interessiert nur, ob eine Variable einen Wert enthält (<> 0), oder 
keinen (0). Im ersten Fall möchte ich als Ergebnis 1 haben, im zweiten 
Fall 0. Es soll kurz sein und in eine Zeile passen.

Gibt es außer mit den zwei '!!'
1
int zahl = 1;
2
Serial.print(!!zahl);
3
zahl = 51;
4
Serial.print(!!zahl);
noch eine Möglichkeit, wenns geht in einem Zeichen, um unabhängig des 
Inhalts von "zahl" nur 0 oder 1 zu erhalten?

: Gesperrt durch Moderator
von René H. (Gast)


Bewertung
2 lesenswert
nicht lesenswert
zahl ? 1 : 0

Grüsse,
René

von Walter S. (avatar)


Bewertung
3 lesenswert
nicht lesenswert
Guten Tag schrieb:
> wenns geht in einem Zeichen, um unabhängig des
> Inhalts von "zahl" nur 0 oder 1 zu erhalten?

brauchst du das für ein Preisauschreiben oder warum ist es wichtig dass 
es nur ein Zeichen ist?

von Alexander S. (alesi)


Bewertung
0 lesenswert
nicht lesenswert
1
printf("%d\n", (i != 0));

von Walter S. (avatar)


Bewertung
-2 lesenswert
nicht lesenswert
René H. schrieb:
> zahl ? 1 : 0

schlecht, das sind ja schon 4 Zeichen, doppelt soviel wie !!

von Guten Tag (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Es sind Variablen zu übergeben, die auch höhere Werte als 1 enthalten 
können. Die Funktion darf aber nur 0 oder 1 als Argument erhalten. Das 
mache ich immer mit "zahl ? 1 : 0" oder nun mit "!!zahl". Vielleicht 
gibts was besseres, das "!!" sieht uncool aus.

C oder C++ natürlich. In den flachen Gewässern, wo ich gerade schwimme 
(yC), mache ich wegen dem Unterschied keinen großen Zirkus. nur 
Basicfunktionen, wo der Compiler keinen Unterschied macht

von Guten Tag (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Walter S. schrieb:
> zahl ? 1 : 0
Guten Tag schrieb:
> zahl ? 1 : 0

Zufälle gibts .. ;)

von Mark B. (markbrandis)


Bewertung
1 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Es sind Variablen zu übergeben, die auch höhere Werte als 1 enthalten
> können. Die Funktion darf aber nur 0 oder 1 als Argument erhalten. Das
> mache ich immer mit "zahl ? 1 : 0" oder nun mit "!!zahl". Vielleicht
> gibts was besseres, das "!!" sieht uncool aus.

In C gibt es weder etwas "Besseres" noch braucht man etwas Besseres.

Typischer Fall von Optimierung an einer Stelle, an der sie kein Schwein 
braucht ;-)

von Guten Tag (Gast)


Bewertung
-8 lesenswert
nicht lesenswert
Walter S. schrieb:
> brauchst du das für ein Preisauschreiben oder warum ist es wichtig dass
> es nur ein Zeichen ist?

Jetzt hören sie mal zu junger Mann. C ist die Abkürzung von "fass dich 
kurz". Und das soll doch auch so bleiben. Ziel ist, das Programm in 
einem Buchstaben zu verfassen.

Nee, ich programiere ja nicht oft in C/CPP, aber man gewöhnt sich an die 
Kürzel und "komprimierten" Operatoren :)

von René H. (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Mark B. schrieb:
> Guten Tag schrieb:
>> Es sind Variablen zu übergeben, die auch höhere Werte als 1 enthalten
>> können. Die Funktion darf aber nur 0 oder 1 als Argument erhalten. Das
>> mache ich immer mit "zahl ? 1 : 0" oder nun mit "!!zahl". Vielleicht
>> gibts was besseres, das "!!" sieht uncool aus.
>
> In C gibt es weder etwas "Besseres" noch braucht man etwas Besseres.
>
> Typischer Fall von Optimierung an einer Stelle, an der sie kein Schwein
> braucht ;-)

Das sind ja nicht mal Optimierungen. Der Assembler Output ist immer der 
selbe. Das ist dann reine Ästhetik, wobei Ästhetik nicht zwingend mit 
Lesbarkeit einhergeht.

Grüsse,
René

von Guten Tag (Gast)


Bewertung
-6 lesenswert
nicht lesenswert
Mark B. schrieb:
> In C gibt es weder etwas "Besseres" noch braucht man etwas Besseres.
>
> Typischer Fall von Optimierung an einer Stelle, an der sie kein Schwein
> braucht ;-)

Na du musst ja wissen, was für mich gut ist. Behalte deine Weisheit für 
dich und wenn du nichts zur Frage weißt, behalte auch deine Worte geren 
für dich.

von Guten Tag (Gast)


Bewertung
0 lesenswert
nicht lesenswert
René H. schrieb:
> Das sind ja nicht mal Optimierungen. Der Assembler Output ist immer der
> selbe. Das ist dann reine Ästhetik, wobei Ästhetik nicht zwingend mit
> Lesbarkeit einhergeht.

Genau so ist es ;)

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Mark B. schrieb:
>> In C gibt es weder etwas "Besseres" noch braucht man etwas Besseres.
>>
>> Typischer Fall von Optimierung an einer Stelle, an der sie kein Schwein
>> braucht ;-)
>
> Na du musst ja wissen, was für mich gut ist. Behalte deine Weisheit für
> dich und wenn du nichts zur Frage weißt, behalte auch deine Worte geren
> für dich.

Die Frage habe ich sehr wohl beantwortet. Es gibt in C nichts 
"Kürzeres".

Ganz sicher gibt es Dinge, die Du in Deinen Programmen verbessern kannst 
(die gibt es bei so ziemlich jedem). Du suchst nur gerade an der 
falschen Stelle danach.

von Guten Tag (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mark B. schrieb:
> Die Frage habe ich sehr wohl beantwortet. Es gibt in C nichts
> "Kürzeres".

Als was?

von Guten Tag (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Ich will dazu schreiben, dass ich nicht alles in C/CPP kenne. Bitmasken 
(8Bit) habe ich vor kurzem noch mit "^255" bit-invertiert. Bis ich "~" 
entdeckt habe. Daswegen frage ich sowas, weil ich nicht alle Operatoren 
kenne. Weil ich nicht oft in C/CPP ar beite

von Coder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Walter S. schrieb:
>> zahl ? 1 : 0
> Guten Tag schrieb:
>> zahl ? 1 : 0
>
> Zufälle gibts .. ;)

Schlechter Stil . Der Datentypen passt nicht. Gefordert ist bool, aber 
ihr nehmt einen int.

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Mark B. schrieb:
>> Die Frage habe ich sehr wohl beantwortet. Es gibt in C nichts
>> "Kürzeres".
>
> Als was?

In C hat eine Variable, die ungleich 0 ist den Wahrheitswert "true", 
eine die gleich 0 ist den Wert "false". Genau das macht man sich mit 
einem Ausdruck wie:

(zahl ? 1 : 0)

zunutze.

Woher kommt eigentlich die Vorstellung, dass es dafür eine kürzere 
Ausdrucksweise geben müsste?

von Oleg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Ziel ist, das Programm in einem Buchstaben zu verfassen.

Viel Erfolg bei der Optimierung :-D

Übrigens ist man bei der Entwicklung von Kompressionsalgorithmen 
mittlerweile so weit, daß man in der Lage ist, die Bibel auf ein 
einziges Bit zu komprimieren!

Nur mit der Dekompression ist man noch nicht ganz so weit :-D

von Guten Tag (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Coder schrieb:
> Schlechter Stil . Der Datentypen passt nicht. Gefordert ist bool, aber
> ihr nehmt einen int.

Gibt kein speziellen "Bool" in C

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Coder schrieb:
>> Schlechter Stil . Der Datentypen passt nicht. Gefordert ist bool, aber
>> ihr nehmt einen int.
>
> Gibt kein speziellen "Bool" in C

Ab C99 schon.

von Guten Tag (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Mark B. schrieb:
> Woher kommt eigentlich die Vorstellung, dass es dafür eine kürzere
> Ausdrucksweise geben müsste?

Ist doch egal. Und wenn es der C-Wahn ist.

OK, verstanden. Ihr könnt aufhören zu lästern. Ich bin mit !! sowieso 
der kürzeste :D

von Mark B. (markbrandis)


Bewertung
2 lesenswert
nicht lesenswert
Guten Tag schrieb:
> Ich bin mit !! sowieso der kürzeste :D

Na dann freu Dich und schmeiß ne Party ;-)

von FK (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
if (zahl != 0)
2
{
3
  zahl  = 1;
4
 }

Und fertig.
Oder willst du den Code mit möglichst kurzen Ausdrücken obfuskieren?

von Guten Tag (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
FK schrieb:
>
1
if (zahl != 0)
2
> {
3
>   zahl  = 1;
4
>  }
5
>
>
> Und fertig.
> Oder willst du den Code mit möglichst kurzen Ausdrücken obfuskieren?

Jepp. So gehts auch
1
byte Gib0oder1() {
2
if(zahl == 0) 
3
  return zahl - zahl;
4
else
5
  return zahl / zahl;
6
}

von Guten Tag (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
byte zahl
ist beim absenden rausgefallen

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht lesenswert
Guten Tag schrieb:
> wenns geht in einem Zeichen,

irgendwo vorher ein
1
#define X !!

Dann geht's ab da so:
1
int zahl = 1;
2
Serial.print(X zahl);

von Gute Nacht (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Guten Tag schrieb:
>> wenns geht in einem Zeichen,
>
> irgendwo vorher ein
>
1
> #define X !!
2
>
>
> Dann geht's ab da so:
>
>
1
> int zahl = 1;
2
> Serial.print(X zahl);
3
>

Danke. Du bist der einzig würdige C-Programmiererer. Die anderen sollen 
besser BASIc nehmen.

von Oleg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gute Nacht schrieb:
> Danke. Du bist der einzig würdige C-Programmiererer. Die anderen sollen
> besser BASIc nehmen.

Du bist vielleicht ein Schätzchen :-)
Daß es GENAU das gleiche ist wie deine allererste Variante, hast du 
nicht bemerkt? Der Präprozessor nimmt hier die Arbeit ab...

von Gute Nacht (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das Leerzeichen stört mich ja noch ein bischen

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Kannst stattdessen auch ein Newline nehmen, wenn dir das lieber ist.

von Oleg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Kannst stattdessen auch ein Newline nehmen, wenn dir das lieber
> ist.

Ist ein Newline kürzer als ein Leerzeichen? ;-)
Er will doch:
> Ziel ist, das Programm in einem Buchstaben zu verfassen.

Beitrag #5650395 wurde von einem Moderator gelöscht.
Beitrag #5650397 wurde von einem Moderator gelöscht.
Beitrag #5650492 wurde von einem Moderator gelöscht.
Beitrag #5650526 wurde von einem Moderator gelöscht.
Beitrag #5650537 wurde von einem Moderator gelöscht.
Beitrag #5650619 wurde von einem Moderator gelöscht.
Beitrag #5650629 wurde von einem Moderator gelöscht.
Beitrag #5650680 wurde von einem Moderator gelöscht.
Beitrag #5650683 wurde von einem Moderator gelöscht.
Beitrag #5650687 wurde von einem Moderator gelöscht.
Beitrag #5650700 wurde von einem Moderator gelöscht.
Beitrag #5650986 wurde von einem Moderator gelöscht.
Beitrag #5651028 wurde von einem Moderator gelöscht.
Beitrag #5651030 wurde von einem Moderator gelöscht.
Beitrag #5651034 wurde von einem Moderator gelöscht.
von Coder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Guten Tag schrieb:
>> wenns geht in einem Zeichen,
>
> irgendwo vorher ein#define X !!
>
> Dann geht's ab da so:
> int zahl = 1;
> Serial.print(X zahl);

Auch Mist. Boolscher , logischer Operator wird auf Ganzzahl angewendet. 
Das einzige, was zum Bool führt ist ein Vergleich. Steht oben schon 
irgendwo.

: Wiederhergestellt durch Moderator
Beitrag #5651184 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Coder schrieb:
> Auch Mist. Boolscher , logischer Operator wird auf Ganzzahl angewendet.
> Das einzige, was zum Bool führt ist ein Vergleich. Steht oben schon
> irgendwo.

Das Ergebnis des Vergleichs ist ein int, der 0 oder 1 ist, ganz genau 
wie beim !!. Macht also keinerlei Unterschied.
War aber auch exakt das, was gewünscht war:

Guten Tag schrieb:
> Im ersten Fall möchte ich als Ergebnis 1 haben, im zweiten
> Fall 0.

Beitrag #5651242 wurde von einem Moderator gelöscht.
Beitrag #5651245 wurde von einem Moderator gelöscht.
Beitrag #5651275 wurde von einem Moderator gelöscht.
Beitrag #5651285 wurde von einem Moderator gelöscht.
Beitrag #5651291 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.