Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bytes sind die kleinsten Einheiten...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.05.2009, 14:02    Titel: Bytes sind die kleinsten Einheiten... Antworten mit Zitat

... 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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 11.05.2009, 14:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.05.2009, 16:49    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 11.05.2009, 16:50    Titel: Antworten mit Zitat

Wenn ich das richtig gesehen habe, belegt der Datentyp BOOLEAN in VBA sogar ganze 2Bytes .. mir eigentlich unverständlicher weise..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.05.2009, 18:01    Titel: Antworten mit Zitat

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 durchgeknallt
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
user123



Anmeldungsdatum: 13.02.2009
Beiträge: 11

BeitragVerfasst am: 11.05.2009, 18:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 11.05.2009, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 12.05.2009, 08:46    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.05.2009, 13:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 16.05.2009, 13:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 16.05.2009, 20:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz