Bitoperation

M4RKU5

Level-1
Beiträge
81
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich entwickle ein Programm in SCL.
ich habe eine Variable vom Datentyp BYTE. Je nachdem welches Bit gesetzt ist wird eine IF-Anweisung ausgeführt. Ich möchte jetzt allerdings keine 256 IF-Anweisungen implementieren. Deshalb möchte ich gerne in einer Schleife mit 8 Durchgängen prüfen, welche Bits gesetzt sind. Dadurch reduziere ich die Anzahl der IF-Anweisungen auf 8.
Wie kann ich nun rausfinden welche Bits gesetzt sind?
 
Zuletzt bearbeitet:
Versuch's mal so:

Code:
VAR
    MyByte: BYTE;
    MyBit AT MyByte : ARRAY[0..7] OF BOOL;
END_VAR

MyBit kannst Du jetzt indiziert (MyBit) durch Deine Schleife laufen lassen und jedes Bit auf einzeln abfragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab zwar die SCL Syntax nicht im Kopf aber so was macht man
imho so in der Art:

//Bit 1
IF (bytewert AND 2#0000_0001) > 0 THEN
.....
END_IF;


//Bit 2
IF (bytewert AND 2#0000_0010) > 0 THEN
.....
END_IF;


usw.....

evtl. kannst du dir das > 0 auch schenken

Man nennt das maskieren anhand der Bitmaske und der AND verknüpfung
kannst du prüfen ob das jeweilige Bit gesetzt ist.


Ich hoffe ich konnte nun auch mal jmd. helfen
Gruß
Michi
 
Ok, werd die beiden Methoden mal ausprobieren. Die 2.Methode habe ich so auch noch von c++ in Erinnerung. Bin nur nicht mehr drauf gekommen.
 
Bei der 2.Methode kriege ich die Fehlermeldung: Ausdruck muss vom Typ BOOL sein. Man muss auf 1 prüfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Variable vom Typ BYTE wird nun aber im Hex-Format dargestellt, so dass die Maskierung nicht funktioniert. Wie kann ich es erreichen das sie im Binärformat dargestellt wird?
 
Es müsste mit 'B#2#00000001' gehen. Wobei wahrscheinlich die führenden Nullen wegfallen.
Also für Bit 0: B#2#1; Bit 1: B#2#10; Bit 2: B#2#100 usw.

Habe ich nicht getestet. Steht so im SCL-Handbuch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... du solltest auf jeden Fall den ersten Vorschlag von Maweri testen. Das ist nicht nur die eleganteste Möglichkeit ... Ich persönlich arbeite bei solchen Sachen generell mit der AT-Sicht. Vielleicht liest du dir dazu auch mal die SCL-Hilfe durch ...

Gruß
LL
 
Hier der Auszug aus dem Handbuch bzw. der Online-Hilfe (s.Grafik).
Wenn das nicht klappt, weiß ich da auch nicht weiter.
 

Anhänge

  • Datentypen.jpg
    Datentypen.jpg
    157,8 KB · Aufrufe: 148
Ich glaub ichhab den fehler Gefunden,
Bytes lassen sich nur auf "=" oder "<> vergleichen.


folgender Code compiliert auf jeden fall

IF (BValue AND B#2#0000_0001) <> B#2#0 THEN
//....
END_IF;

IF (BValue AND 2#0000_0010) <> 0 THEN
//...
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das jetzt der neugierde halber auch mal probiert,
das Problem ist, das Vergleicher ( < oder > ) mit dem Datentyp Byte nicht funktionieren.

Das bedeutet es scheitert am "> 0", das durch ein "<> 0" ersetzt werden muss.

Mist: Zu langsam

Mfg
Manuel
 
... falls ein Vergleich auf größer oder kleiner gewünscht ist ...
Einfach das Byte in INT umwandeln, dann vergleichen ...

Gruß
LL
 
Habs jetzt mit einem Array gemacht, das klappt einwandfrei. Der Code ist auch kürzer, danke an alle.
 
Zurück
Oben