atari-home.de - Foren

Software => Coding => Thema gestartet von: matashen am So 10.08.2008, 13:06:31

Titel: CC65: Bitmanipulation
Beitrag von: matashen am So 10.08.2008, 13:06:31
Hi zusammen,

steh vor der nächsten Hürde, die mich auf regulären System kaum juckt.
Speichersparen!

Und zwar möchte ich verschiedene Informationen in ein Word(16-Bit) packen.

also ein boolsches bit
und drei 5-Bit (da werte von 0..31)

Wie mach ich das ??

Gruß Matthias
Titel: Re: CC65: Bitmanipulation
Beitrag von: tuxie am So 10.08.2008, 16:05:07
Hi,

da kann ich dir sicher helfen aber irgendwie verstehe ich deine Frage nicht so ganz. Möchtest du Bits in einem Register ändern oder so?

Dafür mußt du Logische Verknüpfung verwenden. Bsp.

Wenn du ein Bit setzen möchtest, dann nutzt du ODER Verknüpfung, möchtest du ein Bit löschen dann UND.

Register enthält 0b00001000

Register = Register ODER 0b00000100

0b00001000
0b00000100
__________
0b00000110

Bei UND

0b00001000
0b00000100
__________
0b00000000

Das ganze geht natürlich auch Hexadezimal, ist klar. Einfach dafür den HEX wert nehmen. Ich nehme immer den Windows Taschenrechner zum umrechnen oder auch im Kopf.
Titel: Re: CC65: Bitmanipulation
Beitrag von: matashen am So 10.08.2008, 16:27:12
Also das scheint jetzt an meiner Frage vorbei zu gehen:

Es liegen zum Beispiel die Werte so vor:

var1 10111 (5 Bit)
var2 01100 (5 Bit)
var3 10001 (5 Bit)
var4 1 (1Bit)

und sollen dann so in das Word gelegt werden

10111 01100 10001 1 (16 Bit)

später möcht ich das natürlich wieder zurück lesen
mit & und | kommt mir das etwas seltsam vor, vor allem wie bekomm ich damit die Bits an die richtige Position in der Variable?

Muss ich da sowas machen wie

meine16bit=0;
meine16bit=meine16bit+var1;
shl(5);
meine16bit=meine16bit+var2;
shl(5);
meine16bit=meine16bit+var3;
shl(5);
meine16bit=meine16bit+var4;

und wenn ich das so mache, wie geht das dann in umgekehrter Reihenfolge?

Gruß Matthias

Titel: Re: CC65: Bitmanipulation
Beitrag von: tuxie am So 10.08.2008, 17:51:35
Weiß nicht ob dir das weiter hilft. Denke STichwort wäre bitverschiebung
#
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_9.shtml
Titel: Re: CC65: Bitmanipulation
Beitrag von: matashen am So 10.08.2008, 21:24:47
Also,

wie ich gedacht habe gehts mit Shifts,

aber wie lös ich oben genanntes Beispiel zurück.

Wie kann ich 16Bit auf 3x5 und 1x1 Bit zerlegen.
Ich denke es geht auch mit shifts, aber kann mir da jemand kurz nen Codeschnipsel zu meinem Beispiel geben.

Gruß Matthias
Titel: Re: CC65: Bitmanipulation
Beitrag von: AltF4 am Mo 11.08.2008, 23:59:03
Mit den Variablennamen aus Deinem Code müsste das dann so aussehen:

var4 =  meine16bit        & 0x01;
var3 = (meine16bit >>= 1) & 0x1F;
var2 = (meine16bit >>= 5) & 0x1F;
var1 = (meine16bit >>= 5) & 0x1F;

Gruß,
Ralph
Titel: Re: CC65: Bitmanipulation
Beitrag von: matashen am Di 12.08.2008, 18:10:27
Hey cool Danke, werd das wohl bald ausprobieren...

Gruß Matthias
Titel: CC65: Bitmanipulation - Teil2
Beitrag von: matashen am Fr 19.12.2008, 18:55:59
So, jetzt bin ich mal weider an dem Punkt wo ich das Wissen von euch benötige.

Ich packe 3 verschieden Werte in einen 16Bit Integer(unsigned)

for (i=1;i<9;i++)
   {   
   zw=0;
   zw=bei_feld;
   zw<<=6;
   zw=zw+manyaddons;
   zw<<=7;
   zw=zw+jail;
if (write_eeprom(i+8,zw)) TextOut2(11,80,11,0,".");
   }

so und zurückholen und in einzelteile zerlegen
for (i=1;i<9;i++)
   {
   zw=EE_Read(i+8);
   jail=(zw & 0x07);
   zw>>=3;
   manyaddons=(zw & 0x7F);
   zw>>=7;
   bei_feld=(zw & 0x3F);
   }
Leider stimmen die Werte vor dem packen und nachdem entpacken nicht zusammen, und ich erkenn absolut den Fehler nicht.
Hier also die Frage: Was mach ich falsch???

Gruß Matthias
   

Titel: Re: CC65: Bitmanipulation - Teil2
Beitrag von: gstoll am Sa 20.12.2008, 17:28:14
Leer
Titel: Re: CC65: Bitmanipulation - erledigt
Beitrag von: matashen am Sa 20.12.2008, 18:47:09
Oh ja,
da hab ich was total durcheinandergeschmissen.

Danke

Gruß Matthias