atari-home.de - Foren
Software => Coding => Thema gestartet 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
-
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.
-
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
-
Weiß nicht ob dir das weiter hilft. Denke STichwort wäre bitverschiebung
#
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_9.shtml
-
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
-
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
-
Hey cool Danke, werd das wohl bald ausprobieren...
Gruß Matthias
-
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
-
Leer
-
Oh ja,
da hab ich was total durcheinandergeschmissen.
Danke
Gruß Matthias