Die Aussage dieses XOR-Beispiels ist:
Wenn genau EIN Eingang HI ist, ist auch der Ausgang HI.
Ein Kollege hier hat mal gefragt, ab man XOR kaskadieren kann.
Ja man kann. So kommt man zur Erkenntnis, dass der Ausgang immer dann HI ist, wenn eine ungerade Anzahl der Eingänge HI ist.
FUNCTION CheckPari : BOOL
VAR_INPUT
InByte : BYTE;
END_VAR
VAR_TEMP
TmpByte : BYTE;
TmpArray AT TmpByte : ARRAY[0..7] OF BOOL ;
i : INT;
count : INT;
END_VAR
TmpByte := InByte;
count := 0;
FOR i := 0 TO 7 DO
IF TmpArray[i] = True THEN
count := count + 1;
END_IF;
END_FOR;
CheckPari := (count MOD 2) = 0;
END_FUNCTION
[FONT=courier new]FUNCTION CheckPari : BOOL
[/FONT][FONT=courier new]
VAR_INPUT[/FONT]
[FONT=courier new] InByte : BYTE;[/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]VAR_TEMP[/FONT]
[FONT=courier new] TmpByte : BYTE;[/FONT]
[FONT=courier new] TmpArray AT TmpByte : ARRAY[0..7] OF BOOL ;[/FONT]
[FONT=courier new] i : INT;[/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new] TmpByte := InByte;[/FONT]
[FONT=courier new] CheckPari := NOT TmpArray[0];[/FONT]
[FONT=courier new] FOR i := 1 TO 7 DO[/FONT]
[FONT=courier new] CheckPari := CheckPari XOR TmpArray[i];[/FONT]
[FONT=courier new] END_FOR;[/FONT]
[FONT=courier new]
END_FUNCTION[/FONT]
Nein, denn er wollte nicht wissen, ob der Bytewert gerade ist, sondern ob die Anzahl der gesetzten Bits ungerade ist....
reicht es nicht das Bit xxx.0 abzufragen, ist es nicht gesetzt ist der Zahlenwert gerade.
...
Beispiele:...
Es ist folgendes: Ich habe ein Byte mit einer Nummer (0-254), und würde gern die Bitparität daraus ermitteln.
Also: Wenn die Anzahl der Bits gerade ist: Parität = 0, wenn die Anzahl der Bits ungerade ist: Parität = 1
...
FUNCTION ParityCheck : BOOL
// Return:
// false = Even (Gerade Anzahl Bits ist true)
// true = Odd (Ungerade Anzahl Bits ist true)
VAR_INPUT
IN : BYTE;
END_VAR
VAR_TEMP
val : BYTE;
END_VAR
BEGIN
val := IN;
val := val XOR SHR(IN := val, N := 4);
val := val XOR SHR(IN := val, N := 2);
val := val XOR SHR(IN := val, N := 1);
IF (val AND B#16#1) <> b#16#0 THEN
ParityCheck := true;
ELSE
ParityCheck := false;
END_IF;
END_FUNCTION
Hi,
das geht noch kürzer...
Compute parity in parallel
unsigned int v; // word value to compute the parity of v ^= v >> 16; v ^= v >> 8; v ^= v >> 4; v &= 0xf; return (0x6996 >> v) & 1; The method above takes around 9 operations, and works for 32-bit words. It may be optimized to work just on bytes in 5 operations by removing the two lines immediately following "unsigned int v;". The method first shifts and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v. Next, the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the lowest nibble of v. This number is like a miniature 16-bit parity-table indexed by the low four bits in v. The result has the parity of v in bit 1, which is masked and returned.
Für Byte- Werte kann man die ersten beiden XORs weglassen.
hab' ich einige Schwierigkeiten (ist alles schon 'ne Weile her), so daß mir die Links nicht wirklich weiter helfen....
Für ein Byte:
v ^= v >> 4;
v &= 0xf;
return (0x6996 >> v) & 1
...
L #V // Byte
PUSH // Akku duplizieren
SRW 4 // Hohes Nibble nach unten
XOW // beide Nibbles kombinieren
UW W#16#F // maskieren
L W#16#6996 // "Magic Number"
SRW // schieben
UW W#16#1 // Bit 0 bleibt übrig
L 0
<>I // wenn <> 0
= #ODD // => Parity odd
...das geht noch kürzer...
gegen (auch wenn's noch kein SCL ist, aber m.M.n. die Anzahl der nötigen Anweisungen - SRW, XOR, UW, SRW, UW, <>1):...
Code:[FONT=courier new]...[/FONT] [FONT=courier new] TmpByte := InByte;[/FONT] [FONT=courier new] CheckPari := NOT TmpArray[0];[/FONT] [FONT=courier new] FOR i := 1 TO 7 DO[/FONT] [FONT=courier new] CheckPari := CheckPari XOR TmpArray[i];[/FONT] [FONT=courier new] END_FOR;[/FONT] [FONT=courier new]...[/FONT]
Und bei WORD oder DWORD wird's ja noch mehr, oder?...
...Code:L #V // Byte PUSH // Akku duplizieren SRW 4 // Hohes Nibble nach unten XOW // beide Nibbles kombinieren UW W#16#F // maskieren L W#16#6996 // "Magic Number" SRW // schieben UW W#16#1 // Bit 0 bleibt übrig L 0 <>I // wenn <> 0 = #ODD // => Parity odd
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?