Forum: Mikrocontroller und Digitale Elektronik Logische Operatoren ~ und !


von ben (Gast)


Lesenswert?

Hallo!

Eine kurze Frage...

Situation:

Port D Pin 1 = 0
Port C Pin 1 = 1

Variante 1:

if( ( PINC & (1<<PINC1) ) & ~( PIND & (1<<PIND1) ) )

Variante 2:

if( ( PINC & (1<<PINC1) ) & !( PIND & (1<<PIND1) ) )

Warum funktioniert Variante 1, aber Variante 2 nicht?
Die beiden Operatoren bewirken doch das selbe oder nicht?

Vielen Dank,
ben

von Uwe .. (uwegw)


Lesenswert?

Nein, sie bewirken nicht dasselbe.
! ist ein logisches NOT
~ ist eine bitweise Invertierung

von ben (Gast)


Lesenswert?

Und warum genau funktioniert Variante 2 im obigen Beispiel nicht?

( PIND & (1<<PIND1) ) dürfte FALSE sein, da das bit nicht gesetzt 
ist...mit dem ! bzw NOT davor müsste es doch wieder 1 sein?

von Robert W. (rweber)


Lesenswert?

Servus,

ist nicht ganz dasselbe:

als Typ mal unsigned char vorausgesetzt ergibt sich:

~(PIND & (1<<PIND1) => ~(0 & (1<<0)) => ~(0 & 1) => ~0 => 255


!(PIND & (1<<PIND1) => !(0 & (1<<0)) => !(0&1) => !1 => 0

Gruss,
rweber

von Daniel (Gast)


Lesenswert?

Moin,

Zwischen den geklammerten Ausdrücken würde wohl
&& statt & sinnvoller sein ...

sonst ist
if( ( PINC & (1<<PINC1) ) & !( PIND & (1<<PIND1) ) )
immer false

if( ( PINC & (1<<PINC1) ) && !( PIND & (1<<PIND1) ) )
führt ein logisches UND aus

Gruß
Daniel

von ben (Gast)


Lesenswert?

daaaaanke danke danke!
sehr schön!

das war also das problem...^^

da fällt mir grad noch ne frage ein...
aber die gehört hier net rein...also neuen thread machen...

cu,
ben

von Felix B. (e-b)


Lesenswert?

> da fällt mir grad noch ne frage ein...
> aber die gehört hier net rein...also neuen thread machen...

Ich glaub es wär besser wenn du dich mit den Grundlgaen von C vertraut 
machst als mit eröffnen von Threads

von ben (Gast)


Lesenswert?

teilweise rennen hier leute rum...dat gibet nich o.O

frage: wozu ist dieses forum da?

damit gewisse leute meckern können wenn man es benutzt????

Bin eigentlich kein C Anfänger sondern programmiere schon jahre in C++ 
und mehreren anderen Sprachen. Mit den Bit-Operatoren und der 
Controller-Programmierung hatte ich bisher leider noch nicht sonderlich 
viel zu tun.

Wenn ich hier im Forum eine Frage stelle, dann hab ich da mindestens 
schon mehrere Seiten zu durchgelesen und probiere nebenbei hier am 
Testboard rum.

Aber wenn du dich dann besser fühlst...
Die Frage von der ich oben geredet habe, habe ich inzwischen selbst 
beantwortet.

MfG,
Ben

von Conrad (Gast)


Lesenswert?

Glaub ich auch...
Wenn du nach Jahren in C++ wegen ~ bzw. ! hier nachfragst...

Mit F1 in deiner IDE bzw. in Deinem Handbuch oder Google & Co. hättest 
du wohl die Information schneller Gefunden.

Ja für was ist das Forum da? Nach meiner Ansciht eher um Richtige 
Problem zu lösen!

von ben (Gast)


Lesenswert?

Für welches Software Projekt interessiert mich ne Bit Invertierung?
~ und ! sind was unterschiedliches... Was ich wissen wollte war bloß, 
wieso die eine Variante nicht funktioniert... Zur Lösung meines Problems 
hätten beide funktionieren müssen... Warum hat es nicht gefunkt? => Weil 
ich was anderes übersehen hatte...

Wenn ich ne 0 hab und sonst nix ist das Komplement nicht mehr 0 => true
Wenn ich ne 0 hab ist !0 => 1 => true
Das meinte ich mit das selbe...

Da es nicht funktioniert hat dachte ich der Fehler müsse was damit zu 
tun haben...hatte aber das & und das && übersehen...

Was in jedem Buch darüber steht weiß ich...daraus ging nur hervor was 
ich schon wusste...dass zum negieren beides benutzbar sein muss...

Wozu solche unnötigen kommentare zu hinterlassen...
Zuerst heißt es das forum soll für "richtige probleme" benutzt werden 
und dann wird der startschuss zum off topic gegeben...

von Gast (Gast)


Lesenswert?

Sorry Ben, aber das sind Basics, die muß man einfach draufhaben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.