Binärdarstellung
Übersicht

![]() |
TritonBetreff: Binärdarstellung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Lösung geht leider auch nur bis zu 32 Ziffern... | ||
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schonmal dankeschön für eure Codes. Ich bin sicher, die werden mir weiterhelfen ![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group