mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik wert &= (1<<nr);


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich programmiere mit Codevision und habe folgendes Problem

wert &= (1<<nr);

Bei wert=1 und nr=0 bekomme ich als Ergebnis 0 wobei es ja 1 sein 
müsste.

Was mach ich falsch

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst du das entsprechende Bit (In nr abgelegt) löschen?
Dann so:
wert &= ~(1 << nr)
 (Man beachte die Tilde -> unäres NOT)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein ich möchte eine Bestimmte Taster abfragen und das ganze in eine 
if-Bedingung stellen.
10 Schalter sind am µC angeschlossen(über 2 Ports) und im normalzustand 
alle geschlossen(nach Masse -> also alle 0)

if(wert&(1<<nr)...; //Taste gedrückt
else... //Taste nicht gedrückt

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Daniel,

wieso sollte 0 & 1 gleich 1 sein?
wert = 0 heißt ja wert = 0b00000000 (jetzt mal von 8 bit ausgehend)
nr = 1 heißt (1 << nr) = 0b00000001

Das & macht jetzt eine binäre Verundung Deiner Variablen. Deswegen steht 
dann in wert aber nach wie vor eine 0. Wenn Du das letzte Bit setzten 
willst musst Du verodern (mit |=) nicht verunden.

Viele Grüße

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das ganze in VisualC++ teste, funktioniert das Ganze wie zu 
erwarten

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann würde ich mal darauf tippen, dass deine Variablen nicht das 
enthalten, was du meinst. Wie überprüfst du das denn?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <iostream.h>

int wert;

void main (void)
{
  wert=1;
  if(wert & (1<<0))cout<<"richtisch";
  else cout<<"falsch";
}

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ampfing:

> wert = 0 heißt ja wert = 0b00000000 (jetzt mal von 8 bit ausgehend)
> nr = 1 heißt (1 << nr) = 0b00000001

Liest du hier:

> Bei wert=1 und nr=0 bekomme ich ...

;-)

Wahrscheinlich ist es so, wie Philipp geschrieben hat. Wenn nicht (was
aber unwahrscheinlicher ist), hat der Compiler einen Bug.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ampfing:

> wert = 0 heißt ja wert = 0b00000000 (jetzt mal von 8 bit ausgehend)
> nr = 1 heißt (1 << nr) = 0b00000001

Liest du hier:

> Bei wert=1 und nr=0 bekomme ich ...

;-)

@Daniel:

Und? Was liefert dein neues Testprogramm?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SOORRRYYYY

Fehler von mir, denn Taster 1 liegt an Bitposition 0, d.h.
if( wert & ( 1<<(nr-1) ) )...
dann passt alles.
trotzdem danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.