Binärrechnung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Hi

Betreff: Binärrechnung

BeitragDo, Jul 10, 2008 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Habe vor kurzem mal was mit der Binärrechnung rumgespielt
und drei der Grundrechenarten programmiert

(Hab mich nachher nicht mehr um das Overflowbit
gekümert das liefert momentan fast immer einen Oveflow)

Code: [AUSKLAPPEN]

Global overflowflag=0
Const bits=31 ;bei blitzbasic 31 bit absolutes MAX ! (Dezimales max: 2.147.483.647)


Graphics 300,600,32,2

Repeat
Cls
Locate 0,0

in1=Input("Mul 1: ")
in2=Input("Mul 2: ")

ms=MilliSecs()
result=bintodec(mulbin2(dectobin(in1),dectobin(in2)))
Print MilliSecs()-ms
Print " "
Print result
Print " "
ms=MilliSecs()
result=bintodec(mulbin(dectobin(in1),dectobin(in2)))
Print MilliSecs()-ms
Print " "
Print result
Print " "
printbin(dectobin(result))

WaitKey
Until KeyDown(1)



Function printbin(bank)
Print " "
For i=0 To BankSize(bank)-1
Print PeekByte(bank,i)
Next
Print " "
Print "Überlauf: "+overflowflag
End Function


Function dectobin(dec)
Local bank=CreateBank(bits)
Local i=0
Repeat
If i=bits Then i=0 : overflowflag=1
bit=dec Mod 2
dec=dec/2
PokeByte(bank,(bits-1)-i,bit)
i=i+1
Until dec=0
Return bank
End Function


Function bintodec(binary)
dec=0
For i=0 To bits-1
bit=PeekByte(binary,bits-1-i)
dec=dec+(bit*(2^i))
Next
Return dec
End Function


Function addbin(bin1,bin2)
Local bank=CreateBank(bits)
Local carryflag=0
Local currentbit=0
For i=0 To bits-1
bit1=PeekByte(bin1,bits-1-i)
bit2=PeekByte(bin2,bits-1-i)
Select bit1
Case 0
 If bit2=0 Then
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,0)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,1)
   carryflag=0
  EndIf
 Else
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,1)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,0)
   carryflag=1
  EndIf
 EndIf
Case 1
 If bit2=0 Then
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,1)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,0)
   carryflag=1
  EndIf
 Else
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,0)
   carryflag=1
  Else
   PokeByte(bank,bits-1-i,1)
   carryflag=1
  EndIf
 EndIf
End Select
If i=bits-2 And carryflag=1 Then overflowflag=1
Next
Return bank
End Function


Function subbin(bin1,bin2)
Local bank=CreateBank(bits)
Local carryflag=0
Local currentbit=0
For i=0 To bits-1
bit1=PeekByte(bin1,bits-1-i)
bit2=PeekByte(bin2,bits-1-i)
Select bit1
Case 0
 If bit2=0 Then
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,0)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,1)
   carryflag=1
  EndIf
 Else
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,1)
   carryflag=1
  Else
   PokeByte(bank,bits-1-i,0)
   carryflag=1
  EndIf
 EndIf
Case 1
 If bit2=0 Then
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,1)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,0)
   carryflag=0
  EndIf
 Else
  If carryflag=0 Then
   PokeByte(bank,bits-1-i,1)
   carryflag=0
  Else
   PokeByte(bank,bits-1-i,1)
   carryflag=1
  EndIf
 EndIf
End Select
Next
Return bank
End Function

;optimierte Binäre Multiplikation
Function mulbin(bin1,bin2)
Local bank=CreateBank(bits)
Local cache=CreateBank(bits)
Local next_on=-1
For i=1 To count_on_bits(bin1)
next_on=next_on_bit(bin1,next_on+1)
CopyBank(bin2,0,cache,0,bits)
For j=1 To bits-next_on-1
CopyBank(shlbin(cache),0,cache,0,bits)
Next
CopyBank(addbin(bank,cache),0,bank,0,bits)
CopyBank(clearbank(cache),0,cache,0,bits)
Next
Return bank
End Function

;gewöhnliche Multiplikation
Function mulbin2(bin1,bin2)
Local bank=CreateBank(bits)
If comparebin(bin1,bin2)=1 Then
 For i=1 To bintodec(bin1)
  CopyBank(addbin(bank,bin2),0,bank,0,bits)
 Next
Else
 For i=1 To bintodec(bin2)
  CopyBank(addbin(bank,bin1),0,bank,0,bits)
 Next
EndIf
Return bank
End Function


Function comparebin(bin1,bin2)
Local bank=CreateBank(2)
Local currentbit=0
For i=0 To bits-1
bit1=PeekByte(bin1,i)
bit2=PeekByte(bin2,i)
Select bit1
Case 0
 If bit2=1 Then PokeByte(bank,0,0) : PokeByte(bank,1,1) : Return 1 : Exit
Case 1
 If bit2=0 Then PokeByte(bank,0,1) : PokeByte(bank,1,0) : Return 2 : Exit
End Select
Next
Return 0
Return bank
End Function


Function shlbin(bin1)
cache=CreateBank(bits)
For i=0 To bits-2
PokeByte(cache,i,PeekByte(bin1,i+1))
Next
Return cache
End Function


Function shrbin(bin1)
cache=CreateBank(bits)
For i=0 To bits-1
PokeByte(cache,i,PeekByte(bin1,i-1))
Next
Return cache
End Function


Function count_on_bits(bin1)
For i=bits-count_active_bits(bin1) To bits-1
If PeekByte(bin1,i)=1 Then count=count+1
Next
Return count
End Function


Function count_active_bits(bin1)
For i=0 To bits-1
If PeekByte(bin1,i)=1 Then Return bits-i
Next
End Function


Function next_on_bit(bin1,start)
For i=start To bits-1
 If PeekByte(bin1,i)=1 Then Return i
Next
End Function


Function clearbank(bank)
Return CreateBank(BankSize(bank))
End Function


Function checknumbers(bin1)
Local count=0
For i=bits-count_active_bits(bin1) To bits-1
If PeekByte(bin1,i)=0 Then count=1 : Exit
Next
Return count
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 10, 2008 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine printbin -Funktion macht nicht viel anderes als Bin vom Haus aus.

TestCode: [AUSKLAPPEN]
Local in1=Input("Mul 1: ")
Local in2=Input("Mul 2: ")

Print Bin(in1*in2)

WaitKey
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

FWeinb

ehemals "ich"

BeitragDo, Jul 10, 2008 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist hart !

Sowas Nenne ich mal Optimierung Very Happy

Naja hätte man vorher mal testen soll bevor man sich die Arbeit macht.

mfg

ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs
 

Hi

BeitragDo, Jul 10, 2008 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ist schon klar nur rechnet der dann erst dezimal und verwandelt dann in einen string mit dem man nicht rechnen kann ^^

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jul 11, 2008 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Computer selbst rechnet überhaupt nicht in dezimal, sondern nur binär. Alles was du sonst so siehst, ist eine bereits für uns Menschen umgewandelte dezimalform. Bin macht wiederrum nichts anderes als ein Integer in ein Binärstring umzuwandeln.

Oder was ist damit sagen will; es ist egal ob du nun 1+1, 2-1, 1*1, 8/2, 2^2 machst, intern läuft alles binär ab.

printbin = Bin
dectobin = Bin
bintodec = ?
addbin = +
subbin = -
mulbin = *
comparebin = If in Kombi mit <, >, =
shlbin = Shl
shrbin = Shr und/oder Sar
count_on_bits = mit And möglich
count_active_bits = ?
next_on_bit = mit And und Shr möglich

Wer z.B. eine Addition/Subtraktion/Multiplikation oder Division selbst machen möchte, sollte sich hierbei die weiteren Operatoren And, Or, XOr und ggf. Not ansehen. Allein schon in der Kombination dieser vier Operatoren (den letzten Not kann man sogar durch die anderen umbauen). Damit bekommt man sogar das Verstäntnis darüber, wie der Rechner überhaupt arbeitet.


Edit: Nur so zur Info: Bin ist auch nicht zum rechnen gedacht, sondern mit den Operatoren werden logische Verknüpfungen durchgeführt die ggf. auch Ergebnise errechnen können. Diese funktionieren auch besonders schnell und benötigen kein weiteren Speicher wie beispielsweise eine Bank.

Hier habe ich eben was gefunden, wo Binärrechnungen erklärt werden. Allerdings nur die einfachsten vier Grundrechenarten.
 

Hi

BeitragFr, Jul 11, 2008 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW
ich hätte ja nicht gedacht das du soweit kommst Shocked
ich bin informatiker mir must du das nicht erklären

die funktionen sollen zeigen wie das funktioniert und
wie die cpu die berechnungen ausführt kann

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group