PDA

View Full Version : Ein Binchar feld bitweise füllen



Aban13
09-05-20, 18:42
Hallo,

Ich kämpfe momentan mit folgendem Problem.
Ich muss ein Feldtyp von binchar (8 byte) ab der vierzigste bit mit etwas füllen(z.b mit integer 12)

Für jede Hilfe bin ich Dankbar

Fuerchau
09-05-20, 22:52
Jedes Byte ist vom Typ UINT(3) und kann dann mit den Werten aus beliebigen Kombinationen von 2er Potenzen 1, 2, 4, 8 , 16, 32, 64, 128 gefüllt werden.
Nun must du nur noch abzählen und die passenden Werte setzen.

dcl-ds;
v1 uint(3) inz 1;
v1 uint(3) inz 2;
v1 uint(3) inz 4;
v1 uint(3) inz 8;
v1 uint(3) inz 16;
v1 uint(3) inz 32;
v1 uint(3) inz 64;
v1 uint(3) inz 128;
v uint(3) dim(8) pos(1);
end-ds;

dcl-ds;
bytes8 char(8);
byte uint(3) dim(8) pos 1;
end-ds;

dcl-s bytepos uint(3);
dcl-s bitpos uint(3);

bytepos = %int(Bits / 8) + 1;
bitpos = %rem(Bits:8) + 1;

Byte(bytepos) += v(bitpos); // Bit setzen
Byte(bytepos) -= v(bitpo); // Bit löschen

Oder klassisch mit BITON und BITOFF bzw. %bitand() und %bitnot() => siehe Referenz.

Oder du definierst das Feld als UINT(20) => 8 Bytes und nimmst eine Tabelle mit den 64 Werten.
Um diese nicht ausrechnen zu müssen, kannst du die einer Schleife füllen:
for i=0 to 63;
v(i+1) = 2**i;
next;

Bestimmt fällt da jemandem noch was anderes kompliziertes ein.

Aban13
10-05-20, 07:28
Vielen Dank für die Antwort