Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.05.2009, 14:02 Titel: Bytes sind die kleinsten Einheiten... |
|
|
... aber trotzdem kann man Bits in einem Byte einzeln ansprechen. Warum gibts dann keine Variablen die ein Bit groß sind? .. ich könnte auch arrays aus einzelnen bits manchmal gut gebrauchen!
Klar, es können immer nur mindestens 8-bit im speicher reserviert werden.. halbe bytes oder 1/8 bytes gibts nicht.
Gibts denn nicht trotzdem einen umweg wie man an variablen mit der größe von einem Bit rankommt? ... vor allem ists mehr oder weniger speicherverschwendung, wenn ich ein array aus zig byte höhe und zig bytes breite definiere obwohl ich nur 2 zustände abbilden will. (mache ich bisher immer mit UByte)
Weiss einer was eleganteres als bzw etwas speichersparenderes als ubyte für arrays in denen eine variable nur 2 zustände annehmen soll?
Eine API/Bibliothek die sowas kann könnte ich mir auch sehr gut vorstellen.. also eine bibliothek die einem programmierer einen datentyp bereitstellt mit der er n-dimensionale bit-arrays erstellen könnte... |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 11.05.2009, 14:09 Titel: |
|
|
selbst wenn du ein bit-array hast ist das in der CPU ein byte-array, die CPU arbeitet nicht mit was was kleiner ist als bytes... wenn du nicht so viele bits hast dass dir der speicher ausgeht wenn du sie als bytes speicherst machst du nur dein programm ewig langsam dadurch dass du ein bit-array simulierst.
ansonsten schau dir mal die funktion BIT in der referenz an, du kannst dir relativ einfach auch ne funktion bauen die dann für dich aussieht wie ein bit-array aber intern jedes einzelne bit eines byte-arrays anspricht. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.05.2009, 16:49 Titel: |
|
|
@MisterD: Ja, BIT und BITSET und BITRESET kenne ich.. es ist mir auch klar, das man mit diesen funktionen was "drumherum" basteln kann. Mir gehts ums Speicher-sparen und eine möglichst Basic-konforme Sprachformulierung.. Vor allem wäre es schwierig, funktionen oder subs zu schreiben die es erlauben n-dimensionale arrays bitgenau anzusprechen...
Wenn ich ein feld/raum mit 1024 breite und 1024 höhe und vielleicht noch mit 1024 tiefe erzeuge.. dann bin ich schon bei 1073741824Bytes ... bzw 1048576KByte bzw. >>1024MB<< obwohl ich statt 256 möglichen zuständen in einem byte nur 2 zustände brauche. DANN käme ich lediglich auf: 2097152Bytes bzw
2048KByte bzw >>2MByte<<
der unterschied zwischen 2MByte und 1024MByte ist doch eine überlegung wert oder nicht?
Kurz zu meiner rechnung:
Mit kompletten Bytes, wobei 0=False und 255=True ist:
1024byte * 1024byte * 1024byte = 1073741824byte = 1024MByte
Mit einzelnen Bits, wobei immer komplette bytes reserviert werden müssen um einzelne Bits anzusprechen:
Um 1024 bits anzusprechen brauche ich lediglich 128Byte:
128Byte * 128Byte *128Byte = 2097152Bytes = 2MByte |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 11.05.2009, 16:50 Titel: |
|
|
Wenn ich das richtig gesehen habe, belegt der Datentyp BOOLEAN in VBA sogar ganze 2Bytes .. mir eigentlich unverständlicher weise.. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.05.2009, 18:01 Titel: |
|
|
Denkfehler
OneCypher hat Folgendes geschrieben: | von 256 möglichen zuständen in einem byte nur 2 zustände brauche | Du verwechsels das mit den "darstellbaren Zahlen"
Byte = 256
Short = 65536
Integer = 4294967296
nach deiner Rechnung kommst du mit einem Integerwert aus, da
4.294.967.296 Zustände > 1.073.741.824 Zustände  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
user123
Anmeldungsdatum: 13.02.2009 Beiträge: 11
|
Verfasst am: 11.05.2009, 18:06 Titel: |
|
|
Ich weiss gar nicht was du hast.
Du kannst doch einem Byte 8 Bit abfragen und setzen. Sogar 255 zustände dort ablegen/abfragen... |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 11.05.2009, 19:16 Titel: |
|
|
So übermäßig viel Speicherplatz sparst du dir mit Bits statt Bytes nicht ein. Wie du sicher weißt hat ein Byte acht Bit. Deshalb könnte man mit BOOLEAN-Bits statt Bytes die achtfache Datenmenge (2 Zustände) mit dem selben Speicherplatzverbrauch verwenden.
Eine simple Implementation ist übrigens gar nicht schwer: Ein kleines Beispiel:
Code: | const MAX as integer = 1024
const FALSE as ubyte = 0
const TRUE as ubyte = not FALSE
dim shared boolarr as any ptr
boolarr = Allocate((MAX-1) shr 3 + 1)
function getbool(idx as integer) as ubyte
if idx < 0 or idx > MAX then return 123
return IIf(*(cptr(ubyte ptr, boolarr) + (idx shr 3)) and (1 shl (idx and &B111)), TRUE, FALSE)
end function
sub setbool(idx as integer, stat as ubyte)
if idx < 0 or idx > MAX then return
*(cptr(ubyte ptr, boolarr) + (idx shr 3)) = IIf(stat, *(cptr(ubyte ptr, boolarr) + (idx shr 3)) or (1 shl (idx and &B111)), *(cptr(ubyte ptr, boolarr) + (idx shr 3)) and not (1 shl (idx and &B111)))
end sub
setbool(0, TRUE)
setbool(1, TRUE)
setbool(2, FALSE)
setbool(3, FALSE)
setbool(4, TRUE)
setbool(5, FALSE)
setbool(6, TRUE)
setbool(7, FALSE)
setbool(8, TRUE)
setbool(9, FALSE)
for q as integer = 0 to 9
if getbool(q) then print "TRUE" else print "FALSE"
next
sleep
Deallocate(boolarr) |
Der Hauptbestandteil eines solchen Programms macht nicht viel mehr als zehn Zeilen aus. Der große Nachteil einer solchen Variante ist der Geschwindigkeitsverlust. Die Verwendung eines Bytes für ein BOOLEAN wäre weitaus schneller. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 12.05.2009, 08:46 Titel: |
|
|
@volta: eine darstellbare zahl ist doch ein bestimmter zustand eines bytes. bei 256 möglichen zuständen die ein byte annehmen kann, kann man zahlen bis 255 darstellen (256-1 weil 0 als zustand mitgezählt wird). Oder reden wir grad aneinander vorbei?
klar, man könnte die 8-fache menge an "boolean"-variablen in einem byte unterbringen. Das hat St_W absolut richtig erkannt! Zwangsläufig muss man dann im speicher immer komplette bytes belegen.. würde ich z.B. 12 Bit brauchen, müsste ich 2 bytes belegen. Was St_W mit
Code: |
boolarr = Allocate((MAX-1) shr 3 + 1)
|
ausgedrückt hat (wenn ich das richtig interpretiere, obwohl ich mich mit shr nich so gut auskenne)
@user123: Rüschtüüsch.. aber gibts ne möglichkeit genau das transparent für den programmierer als datentyp zu verwenden? Ich möchte keine funktionen benutzen um einzelne bits anzusprechen sondern am liebsten normale variablen dimensionieren und sie verwenden.. vor allem könnte ich mir damit viel umkodiererei in meinen programmen sparen! .. es wäre auch noch wesentlich eleganter wenn man schreiben könnte:
Code: |
dim raum(1 to 1024, 1 to 1024, 1 to 1024) as bit
|
anstatt den (zwar praktikablen, aber unflexiblen, weil nicht multidimensional) code von St_W zu benutzen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 12.05.2009, 13:31 Titel: |
|
|
12 bit im speicher ablegen wird spätestens dann schwierig, wenn du die wieder adressieren willst und es ist verdammt langsam - beides dank unserer heutigen 32-/64-bit architektur. diese architekturen sind nunmal nicht für 12, 13 oder 14 bits ausgelegt, sondern für 8,16,32,64,128...
Und da kaum ein Programm nur aus BOOLs besteht, geht wohl auch kaum speicher verloren. der geht eher an anderen stellen baden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 16.05.2009, 13:15 Titel: |
|
|
Das Problem ist: Jedes Bit muß architekturbedingt von einem Byte abgezogen werden. Die übrigen 7 Bits stehen dann für andere Dinge nicht zur Verfügung. Somit ist trotzdem ein volles Byte verbraucht. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 16.05.2009, 20:01 Titel: |
|
|
Sonst eine Anwendung von mir, wo die hier diskutierte Problematik zum Tragen kommt:
http://www.dreael.ch/Deutsch/Download/Mastermind-Knacker.html
=> In den BASIC-Versionen ist noch die "verschwenderische" Variante implementiert (Integer-Array für die Boolean-Streichtabelle), während die C++-Version voll bitoptimiert arbeitet, so dass mit dieser Version entsprechend komplexe Mastermind-Spiele gelöst werden können.
Besonderheit dort übrigens: Durch das Array arbeitet man sich dort immer sequenziell durch -> Dementsprechend wird nur immer alle 32 Schritte das Arrayelement abgelegt und das nächste aus dem RAM geholt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|