Binärrechnung
Übersicht

HiBetreff: Binärrechnung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine printbin -Funktion macht nicht viel anderes als Bin![]() 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 |
FWeinbehemals "ich" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist hart !
Sowas Nenne ich mal Optimierung ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ist schon klar nur rechnet der dann erst dezimal und verwandelt dann in einen string mit dem man nicht rechnen kann ^^ | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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![]() 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 ![]() shlbin = Shl ![]() shrbin = Shr ![]() ![]() count_on_bits = mit And ![]() count_active_bits = ? next_on_bit = mit And ![]() ![]() Wer z.B. eine Addition/Subtraktion/Multiplikation oder Division selbst machen möchte, sollte sich hierbei die weiteren Operatoren And ![]() ![]() ![]() ![]() Edit: Nur so zur Info: Bin ![]() Hier habe ich eben was gefunden, wo Binärrechnungen erklärt werden. Allerdings nur die einfachsten vier Grundrechenarten. |
||
Hi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
WOW
ich hätte ja nicht gedacht das du soweit kommst ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group