Autor Thema: CC65: Bitmanipulation  (Gelesen 19132 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline matashen

  • Benutzer
  • Beiträge: 1.779
CC65: Bitmanipulation
« 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
Have you played Atari today ?!

Offline tuxie

  • Benutzer
  • Beiträge: 6.836
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: CC65: Bitmanipulation
« Antwort #1 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.
Tschau Ingo

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: CC65: Bitmanipulation
« Antwort #2 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

Have you played Atari today ?!

Offline tuxie

  • Benutzer
  • Beiträge: 6.836
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: CC65: Bitmanipulation
« Antwort #3 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
Tschau Ingo

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: CC65: Bitmanipulation
« Antwort #4 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
Have you played Atari today ?!

Offline AltF4

  • Benutzer
  • Beiträge: 49
Re: CC65: Bitmanipulation
« Antwort #5 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

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: CC65: Bitmanipulation
« Antwort #6 am: Di 12.08.2008, 18:10:27 »
Hey cool Danke, werd das wohl bald ausprobieren...

Gruß Matthias
Have you played Atari today ?!

Offline matashen

  • Benutzer
  • Beiträge: 1.779
CC65: Bitmanipulation - Teil2
« Antwort #7 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
   

Have you played Atari today ?!

gstoll

  • Gast
Re: CC65: Bitmanipulation - Teil2
« Antwort #8 am: Sa 20.12.2008, 17:28:14 »
Leer
« Letzte Änderung: Mo 27.09.2010, 07:40:50 von gstoll »

Offline matashen

  • Benutzer
  • Beiträge: 1.779
Re: CC65: Bitmanipulation - erledigt
« Antwort #9 am: Sa 20.12.2008, 18:47:09 »
Oh ja,
da hab ich was total durcheinandergeschmissen.

Danke

Gruß Matthias
Have you played Atari today ?!