Binärcode zu Zahl

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Marek

Betreff: Binärcode zu Zahl

BeitragMi, Jun 20, 2007 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte grade das Problem, das ich einen binärcode hatte und daraus die Zahl errechnen wollte. Da Blitz Basic allerdings keine direkte Funktion hat (?!) um das zu bewerkstelligen, hab ich kurzerhand eine geschrieben Laughing
Der einzige Nachteil: Zurückgegeben wird ein String! Ging leider nicht anders, da Integer zu klein wurden^^
Lange Rede kurzer Sinn, hier der Code:
Code: [AUSKLAPPEN]
Function binary$(code$)
 var$="1"
 ret$="0"
 For x=-Len(code$) To -1
  y=Abs(x)
  s$=Mid$(code$,y,1)
  If s$="1" Then
   ret$=Plus$(ret$,var$)
  EndIf
  var=Plus$(var$,var$)
 Next
 Return ret$
End Function

Function Plus$(s1$,s2$)
 .nomma
 If Len(s1$)>Len(s2$) Then
  s2$="0"+s2$
  Goto nomma
 ElseIf Len(s2$)>Len(s1$) Then
  s1$="0"+s1$
  Goto nomma
 EndIf
 rest=0
 For x=-Len(s1$) To 0
  If Not x=0 Then
   y=Abs(x)
   s$=Mid(s1$,y,1)
   k$=Mid(s2$,y,1)
   z1=Int(s$)
   z2=Int(k$)
   z=z1+z2+rest
   If z>9 Then
    z=z-10
    rest=1
   Else
    rest=0
   EndIf
   rets$=Str$(z)+rets$
  Else
   If rest=1 Then
    rets$="1"+rets$
   EndIf
  EndIf
 Next
 Return rets$
End Function

Ps.: die Funktion Plus(summand1$,summand2$) ist nur vür Nichtkommazahlen!
MfG Marek
Wer lesen kann ist klar im Vorteil...

Smily

BeitragMi, Jun 20, 2007 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
einmal hätte gerreicht ^^

das geht aber auch einfacher:

Code: [AUSKLAPPEN]
Function binary(code)
   For x = 1 To Len(code)
      z = Mid$(code, x, 1)
      ret = (ret * 2) + z
   Next
   Return ret
End function
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Marek

BeitragMi, Jun 20, 2007 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein:
Die letzte Zahl steht vür die 1, nicht die erste Wink
Also:
10000000
ist 128, nicht 1^^
Und: Dein Code kann nicht so große Zahlen ausrechnen wie meiner Wink
Deiner schafft nichtmal 32 Bit Wink
Das war ja grade mein Problem...
Wegen dem 2x, sry Embarassed
MfG Marek
Wer lesen kann ist klar im Vorteil...

Smily

BeitragMi, Jun 20, 2007 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
öhm was? oO
Das Binärsystem funktioniert genauso wie das Dezimalsystem nur mit der basis 2.

Also erst die großen zahlen dann die kleinen:

0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5
110 = 6
111 = 7
1000 = 8
.....
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Willi die Rübe

BeitragMi, Jun 20, 2007 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function ToBin$(z%)
   Local val$
   Repeat
      val$=(z Mod(2))+val$
      z=Floor(z/2)

      If z=1 Then val$="1"+val$ : Exit
      If z=0 Then Exit            
   Forever
   
   Return val$
End Function

Das ist meine Variante für eine solche Funktion, die theoretisch unendlich Bit unterstützen würde. Habe ich extra in BlitzBasic "entworfen" um sie nach Ruby zu konvertieren. Funktioniert einwandfrei.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

StepTiger

BeitragMi, Jun 20, 2007 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann natürlich auch einfach binär verschieben...

Code: [AUSKLAPPEN]
Function BinToNum(tbin$)
   
   let=Len(tbin$)
   
   For x=1 To let
      
      num=Int(Mid$(tbin$,x,1))
      
      If Not(num=0 Or num=1)
         
         y=1
         
      EndIf
      
   Next
   
   If y=1 Then Return 0
   
   For x=1 To let
      
      z=z+(Int(Mid$(tbin$,x,1)) Shl (let-x))
      
   Next
   
   Return z
   
End Function


Ohne die Prüfroutine ist es noch schneller...
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Willi die Rübe

BeitragDo, Jun 21, 2007 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Und mal abgesehen davon, dass Blitz eine eingebaute Funktion hat:

Code: [AUSKLAPPEN]
zahl = %10010
Print zahl
waitkey()
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

TheMatrix

BeitragDo, Jun 21, 2007 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, woher weißt du das denn mit dem %? Das hab ich noch nirgends gelesen. Voll genial!
°_° °.° °~° °v° .. -.-
 

Marek

BeitragDo, Jun 21, 2007 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur, geht das auch mit ner Variable?
Wer lesen kann ist klar im Vorteil...
 

Deforation

BeitragDo, Jun 21, 2007 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.

Mit einer Variabel scheint es nicht zu gehen.

Aber weiss jemand, was dies hier bezweckt.

zahl = $10
Print zahl
WaitKey()

Die Ausgabe beträgt "16"

TheProgrammer

BeitragDo, Jun 21, 2007 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist für das hexdezimale Zahlensystem gedacht.. also die 16 (dezimal) ist die 10 im hexdezimalen System.
aktuelles Projekt: The last day of human being
 

ByteCroc

BeitragFr, Jun 22, 2007 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@Marek
Evtl. hab ich nicht genau begriffen was binary$ und Plus$ genau bewirken sollen.
Meiner Meinung nach produziert Plus$ einen Fehler, siehe Demo-Code

Mit StingToBin() und BinToString$() müsste eigentlich alles abgedeckt sein in Blitz.
Ob es im Codeforum schon gleichwertige oder bessere Funktionen dafür gibt hab ich nicht nachgeschaut.

Code: [AUSKLAPPEN]

Print "%1100 = " + %1100

Print BinToString$( %1100 ) ;Wert Binär übergeben
Print BinToString$( 12 )  ;Wert Dezimal übergeben
Print BinToString$( $C )  ;Wert Hexadezimal übergeben

Print StringToBin( "1100" )
Print StringToBin( "%1100" )

Print "%100011101100001100100 = " + %100011101100001100100
Print StringToBin( "%100011101100001100100" )
Print StringToBin( "100011101100001100100" )

;Blitzinterne Rechenfunktionen
zahl = %1001 + %1100
Print zahl
Print BinToString$(Zahl)

; Mareks Function produziert hier einen Fehler
Print "FEHLER >>>>> Plus$("+Chr$(34)+"1001"+Chr$(34)+","+Chr$(34)+"1100"+Chr$(34)+")  = " + Plus$("1001","1100")

;Drei mal das selbe Ergebnis
S$ = Str$(%1100)
Print S$
Print %1100
Print binary$("1100")

WaitKey()

End



; BStr$ = BinToString$( Zahl )
Function BinToString$(num)
   Local bstr$
   Local t$
   For i = 0 To 31
      If (num And ( 1 Shl (i))) Shr(i)
         bstr$ = "1" + t$ + bstr$
         t$ = ""
      Else
         t$ = "0" + t$
      EndIf
   Next
   Return "%"+bstr$  ; Hier evtl. Vorzeichen "%" entfernen wer es ohne haben möchte.
End Function

; Zahl = StringToBin( "%1100" )  oder Zahl = StringToBin( "1100" )  ;mit oder ohne Vorzeichen: "%"
Function StringToBin(BStr$)
   Local bout, i, li, lt
   Local t$
   t$ = Trim$( BStr$ )
   If Left$ ( t$, 1 ) = "%"  Then t$ = Mid$( t$, 2, -1)
   lt = Len(t$)
   If  lt > 32 Then Return -1
   For  i = 1 To lt
      li = lt-i
      If Mid$( t$, i, 1) = "1"
         bout = bout Or ( 1 Shl ( li ))
      EndIf
   Next
   Return bout
End Function

Function binary$(code$)
   var$="1"
   ret$="0"
   For x=-Len(code$) To -1
      y=Abs(x)
      s$=Mid$(code$,y,1)
      If s$="1" Then
         ret$=Plus$(ret$,var$)
      EndIf
      var=Plus$(var$,var$)
   Next
   Return ret$
End Function

Function Plus$(s1$,s2$)
   .nomma
   If Len(s1$)>Len(s2$) Then
      s2$="0"+s2$
      Goto nomma
   ElseIf Len(s2$)>Len(s1$) Then
      s1$="0"+s1$
      Goto nomma
   EndIf
   rest=0
   For x=-Len(s1$) To 0
      If Not x=0 Then
         y=Abs(x)
         s$=Mid(s1$,y,1)
         k$=Mid(s2$,y,1)
         z1=Int(s$)
         z2=Int(k$)
         z=z1+z2+rest
         If z>9 Then
            z=z-10
            rest=1
         Else
            rest=0
         EndIf
         rets$=Str$(z)+rets$
      Else
         If rest=1 Then
            rets$="1"+rets$
         EndIf
      EndIf
   Next
   Return rets$
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group