Binärdarstellung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Triton

Betreff: Binärdarstellung

BeitragFr, Nov 10, 2006 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

also angenommen, ich habe irgendeine beliebig große Zahl, z.B 55 und brauche nun
ihre Binärdarstellung (110111) und zwar iterativ von rechts beginnend.
Dazu kann ich nicht die BB-übliche Funktion bin nutzen, da die nur bis 2^32 funktioniert.

Mit anderen Worten: ich will eine Schleife bei der ich von rechts erfahre, wie die Zahl 55 Binär dargestellt wird.

Also:
- 1 - jo
- 2 - jo
- 4 - jo
- 8 - no
- 16 - jo
- 32 - jo


Wobei die Stichpunkte die Schleifendurchgänge anzeigen Wink

Umgekehrt (32 -> 16 -> 4 -> 2 -> 1) wärs ja einfach, aber so fällt es mir im Moment nicht ein. Vielleicht gibt es ja auch eine ganz einfache Lösung.


Vorschläge?
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

Florian

BeitragFr, Nov 10, 2006 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Beliebig große Zahl lassen sich mit einer Speicherbank darstellen .

Code: [AUSKLAPPEN]

Bank=CreateBank(10)


Print GetBankBin$(Bank,0,16)
WaitKey

Function GetBankBin$(Bank,BitNr,BitZahl)
 For I=BitNr To BitZahl+BitNr-1
  If GetBankBit(Bank,I) Then
   S$=S$+"1"
  Else
   S$=S$+"0"
  EndIf
 Next
 Return S$
End Function


Function GetBankBit(Bank,BitNr)
 Return PeekByte(Bank,Ceil#(BitNr/8)) And 2^(BitNr Mod 8)
End Function


MfG

Florian

Triton

BeitragFr, Nov 10, 2006 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte eigentlich ohne Arrays, Banks oder zusätzliche Funktionen auskommen..

Abgesehen davon ist mir die Funktionsweise deines Codes etwas unklar - produziert bei mir meistens nur Nullen?
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Christoph

BeitragFr, Nov 10, 2006 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs geschafft:

Code: [AUSKLAPPEN]
   Binar$=""
   zahl=input("Zahl: ")
   j=1
   For i=0 To 31
      If zahl/j Mod 2=1 Then Binar="1"+Binar Else Binar="0"+Binar
      j=j*2
   next
   Print Bin(zahl)
   Print Binar


So meinst du das, oder?
  • Zuletzt bearbeitet von Christoph am Fr, Nov 10, 2006 19:23, insgesamt 5-mal bearbeitet
 

Florian

BeitragFr, Nov 10, 2006 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Bits müssen doch in der Speicherbank gesetzt sein.
Nicht gesetzte Bits ergeben immer 0.

Code: [AUSKLAPPEN]

Bank=CreateBank(10)
PokeByte Bank,0,1+4+16+64
PokeByte Bank,1,1

Print GetBankBin$(Bank,0,16)
Print "1234567890123456"
WaitKey

Function GetBankBin$(Bank,BitNr,BitZahl)
 For I=BitNr To BitZahl+BitNr-1
  If GetBankBit(Bank,I) Then
   S$=S$+"1"
  Else
   S$=S$+"0"
  EndIf
 Next
 Return S$
End Function


Function GetBankBit(Bank,BitNr)
 Return PeekByte(Bank,Ceil#(BitNr/8)) And 2^(BitNr Mod 8)
End Function


MfG

Florian
 

Dreamora

BeitragFr, Nov 10, 2006 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Array, Bank oder sonst etwas wirst du nicht auskommen, denn da du wie du schon erkannt hast, nur bis 2^32 mit Zahlen arbeiten kannst, muss deine Zahlenstruktur "/2" (Int Division, also DIV bzw. shift right) und "mod 2" unterstützen um die Bitfolge zu erzeugen.

Wenn sie das tut, ist das ganze relativ einfach, indem du statt Bitflag Vergleiche einfach die Bitfolge aufbaust mittels Division und Modulo.
Code: [AUSKLAPPEN]

; Pseudo Code
bitfolge$ = ""
While Zahl > 0
  if Zahl mod 2 = 1
    bitfolge = "1" + bitfolge
  else
    bitfolge = "0" + bitfolge
  endif
  zahl = zahl / 2
wend
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Fr, Nov 10, 2006 19:32, insgesamt einmal bearbeitet

Christoph

BeitragFr, Nov 10, 2006 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Lösung geht leider auch nur bis zu 32 Ziffern...
 

Florian

BeitragFr, Nov 10, 2006 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
BitString
Code: [AUSKLAPPEN]

S$=Chr$(1 + 4 + 8)+Chr$(1)
Print GetBitStringBin$(S$,0,16)
Print "1234567890123456"
WaitKey

Function GetBitStringBin$(S$,BitNr,BitZahl)
For I=BitNr To BitZahl+BitNr-1 :If (Asc(Mid$(S$,1+Ceil#(I/8))) And  2^(I Mod 8) ) Then
   B$=B$+"1"
  Else
   B$=B$+"0"
  EndIf
 Next
 Return B$
End Function


Function GetBitString(S$,BitNr,BitZahl)
 Return Asc(Mid$(S$,1+Ceil#(BitNr/8))) And  2^(BitNr Mod 8)
End Function

Rone

BeitragFr, Nov 10, 2006 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
zahl = 55
Szahl$=""
bss = 1
For i:Int = 0 To 31
   value = ( zahl & bss ) Shr i
   Szahl = value + szahl
   bss = bss * 2
Next
Print Szahl

Triton

BeitragFr, Nov 10, 2006 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Seht ihr, es geht um Geschwindigkeit.
Ich will beispielsweise 55² = 3025 ausrechnen. Das kann man über pure Addition lösen:

Code: [AUSKLAPPEN]

1   55
2   +(55+55)
4   +(110+110)
16   +(440+440)
32   +(880+880)
---------------------
55   3025


Bei 55 ist es ja nun kein Problem. Aber bei 100 oder 1000-Stelligen Zahlen wird es schon schwieriger. Wenn man mit solchen großen Zahlen rechnet, so sind vorallem
nur Addition/Subtraktion verdammt schnell.

Es gilt also jede Multiplikation und jede Division zu vermeiden.

Um nun das letzte Glied in dem Beispiel oben auszurechnen (880+880) bräuchte
ich also nur 5 simple Additionsschritte und weiß, dass ich alle weiteren Glieder die ich dazurechnen muss, eigentlich schon ausgerechnet habe. Daher wäre es dumm,
32+16+4+2+1 zu rechnen (weil man eben vieles doppelt macht) und besser 1+2+4+16+32.

Bei der ersten Version müsste man 12 Additionen durchführen, bei der zweiten nur 5.

Wenn nun die Zahlen hunderte Stellen lang sind, wäre der Unterschied schon frappierend. (5100 zu 332 bei 100 Stellen)
Coding: silizium-net.de | Portfolio: Triton.ch.vu

MhhF

BeitragFr, Nov 10, 2006 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitteschön, für eine beliebig große Zahl von rechts beginnend.

Code: [AUSKLAPPEN]
Print setbin("4294967296")


Function setbin$(s$)
If Int(s)=1 And Len(s)=1 Then Return 1
Return Int(Right(s,1)) Mod 2 + setbin(zweck(divt(s)))
End Function

Function divt$(s$,t=0)
If s="" Then Return ""
c=Int(Left(s,1))
Return Int(Ceil(c/2)+t)+divt(Right(s,Len(s)-1),(c Mod 2)*5)
End Function

Function zweck(s$)
If Left(s,1)="0" Then Return zweck(Right(s,Len(s)-1))
Return s
End Function


Fals du nur mit Zahlen jongieren willst und dir die Sprache nicht relevant ist empfehle ich dir haskell, ist sehr schnell und du kanst mit beliebig großen Zahlen arbeiten.
  • Zuletzt bearbeitet von MhhF am So, Nov 12, 2006 13:13, insgesamt einmal bearbeitet

Triton

BeitragFr, Nov 10, 2006 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Schonmal dankeschön für eure Codes. Ich bin sicher, die werden mir weiterhelfen Smile
Coding: silizium-net.de | Portfolio: Triton.ch.vu

SpionAtom

BeitragSa, Nov 11, 2006 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du da vorhast, erinnert mich stark an die Vorgehensweise des Repeated Squaring (ich hoffe, das war das), welches ich als Hilfsmittel für die RSA-Verschlüsselung kennengelernt habe. Vielleicht kennst du es ja, vielleicht findest du noch Anreize für deine Sache, wenn du dich darüber informierst...
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group