[AWL] *erledigt* Anzahl der Einsen in einem Byte bestimmen

marac

Well-known member
ID: 272843
L
1 Februar 2007
2.061
321
Ich hab mal eine Frage zu einer "Programmiersprache", die hier wahrscheinlich nicht so geläufig ist: AWL zur Programmierung einer S7-Steuerung.

Gibt es eine einfache Methode die Anzahl der Einsen in einem Byte zu ermitteln, bzw. festzustellen, dass genau ein Bit in diesem Byte eine Eins ist?

Ein Konstrukt ala
PHP:
U     #Bit0
UN    #Bit1
UN    #Bit2
UN    #Bit3
UN    #Bit4
UN    #Bit5
UN    #Bit6
UN    #Bit7
O(
UN    #Bit0
U     #Bit1
UN    #Bit2
UN    #Bit3
UN    #Bit4
UN    #Bit5
UN    #Bit6
UN    #Bit7
)
O(
UN    #Bit0
UN    #Bit1
U     #Bit2
UN    #Bit3
UN    #Bit4
UN    #Bit5
UN    #Bit6
UN    #Bit7
)
O(
.
.
.
wollte ich möglichst vermeiden...
 
Zuletzt bearbeitet:
ich programmiere zwar kein AWL, aber wie wäre es hiermit:
Code:
Bit0 xor Bit1 xor Bit2 xor Bit3 xor Bit4 xor Bit5 xor Bit6 xor Bit7
 
ich programmiere zwar kein AWL, aber wie wäre es hiermit:
Code:
Bit0 xor Bit1 xor Bit2 xor Bit3 xor Bit4 xor Bit5 xor Bit6 xor Bit7
Das funktioniert, wenn du ausschließen willst, dass es zwei Bits sind, allerdings, wenn es drei (oder eine beliebige ungerade Anzahl) sind, kommt auch wieder eins raus...

Habe inzwischen aber selbst eine Lösung gefunden:
PHP:
L     #Byte
NEGI                          // 2er-Komplement bilden
L     #Byte
UW                            // das Byte mit seinem 2er-Komplement bitweise verunden
L     #Byte
==I                           // Wenn das Ergebnis gleich ist, ist kein oder genau ein Bit gesetzt

Hatte da noch sowas im Kopf, dass wenn man ein Byte (oder Wort) mit seinem eigenen 2er-Komplement verundet, das niederwertigste Bit stehen bleibt und alles andere Null wird. Und wenn das gleich dem Ausgangsbyte ist, war das niederwertigste Bit wohl auch das Einzige.
(Nur den Fall, dass alles Nullen sind, muss man zusätzlich ausschließen.)
 
Ich hab auch nichts mit AWL zu tun, aber für die genaue Anzahl der Einsen:

mal in C:

Code:
count = 0;                              // Einsen-Zähler
dummy = 0x01;                       // Maske
for (i=0;i<8;i++)                      // Schleife über die 8 Bit des Bytes
   {
   if (BYTE & dummy) count++;  // wenn Bit gesetzt Zähler erhöhen
   dummy = dummy << 1;         // Bit in der Maske eins weiterschieben
   }
 
Die xor-Variante ist doch schon nett.

Ich hab auch nichts mit AWL zu tun, aber für die genaue Anzahl der Einsen
Klar, Schleife wäre auch eine Möglichkeit, aber da es bei der Steuerungs-Programmierung sehr häufig auf die Geschwindigkeit des Programms ankommt, ist diese Lösung auch nicht ganz optimal...
Trotzdem Danke euch beiden!