Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 29.09.2008, 22:41 Titel: [solved] binäres Addieren - oder: Logik xD |
|
|
Hi Leutz
Heute habe ich folgendes Problem:
Ich habe auf einer bestimmten Platform keine 32 Bit Integers zur Verfügung, muss aber mit solchen Rechnen.
Nunja, OK, einen UDT erstellt, low-Part, high-Part fertig.
Aber: Wie kann ich da jetzt die Bits Shl'en, Shr'en, Or'en, Xor'en, And'en, Addieren und Subtrahieren?
Jemand in einem anderen Forum hat folgendes Vorgeschlagen:
Code: | //Muster - Ungetestet
leftRotate(int x1, int x2, int shift) {
x1 = (x1 << 4) | (x2 & (0xF000));
x2 = x2 << 4;
} |
Verstehe das aber nicht so ganz!
Need Help! Bin auf dem Gebiet echt nicht so der Experte...
Zuletzt bearbeitet von 28398 am 01.10.2008, 15:21, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 29.09.2008, 22:46 Titel: |
|
|
AND, OR und XOR sollten kein Problem sein, die kannst du im low-Part und im high-Part getrennt vornehmen.
SHL und SHR könnte ich mir so vorstellen, dass du das im low-Part "normal" machst und überprüfst, was du im high-Part nachschieben musst (je nach Richtung). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 30.09.2008, 04:34 Titel: |
|
|
gibts in fb kein shl/shr? wenn nich dann kann man sich workarounds basteln:
x shl n = x*2^n
x shr n = x/2^n
(vorausgesetzt du hast unsigned variablen, bei signed muss man den rechtsshift in arithmetischen und logischen rechtsshift trennen)
Eventuelle aktionen mit den Bits die ein- oder ausgeshiftet werden musst du so halt von hand machen. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 30.09.2008, 13:25 Titel: |
|
|
shl/shr gibt's, aber...
Zitat: | Ich habe auf einer bestimmten Platform keine 32 Bit Integers zur Verfügung |
klingt nicht nach FB.  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.09.2008, 14:48 Titel: |
|
|
und es klingt auch nicht danach als gäbe es shl / shr nicht?
es gibt dafür nur keine 32bit Variablen.
Ich würde es in Asm lösen
Vorschlag in FB Syntax:
Code: | Sub leftshift(xlo As Short, xhi As Short, xshift As Short)
For i = 1 To xshift
xhi = xhi Shl 1
If (xlo And &H8000) Then xhi = xhi + 1
xlo = xlo Shl 1
Next
End Sub |
Aber Achtung! rotieren ist etwas anderes als shiften:
Code: | Sub leftRotate(xlo As Short, xhi As Short, xRotate As Short)
For i = 1 To xRotate
x = xhi And &H8000
xhi = xhi Shl 1
If (xlo And &H8000) Then xhi = xhi + 1
xlo = xlo Shl 1
If x Then xlo = xlo + 1
Next
End Sub |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 30.09.2008, 17:16 Titel: |
|
|
@nemored:
Ok, das habe ich mir schon (fast) gedacht - Aber gut eine Bestätigung zu haben
@MisterD:
Nein, keine unsigned Variablen (leider)
Es geht allerdings um die XTEA Verschlüsselung, da meinen die wohl einen binären Shift (<< und >> im C-Code)
@Jojo:
Yes - kein FB, sondern ein leicht merkwürdiger Basic-Dialekt: BASIC++ (sehr gewöhnungsbedürftig)
@volta:
Das wäre also ein Shl - aber doch auch nur für 16 Bit Zahlen!?
xlo = Eingang? xhi = Ausgang?
Verstehe ich nicht so ganz---
Soweit ich XTEA durchblicke verwendet XTEA nur XOr, Or, And, Shl, Shr
Frage:
Ist Or'en das gleiche wie Addieren?
Wie subtrahiere ich dann? |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.09.2008, 17:20 Titel: |
|
|
Eingang? Ausgang? es wird doch nur eine Zahl geshiftet, oder?
xlo(=Short) = Bit 0-15, xhi(=Short) = Bit 16-31 der 32 Bit Zahl _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 30.09.2008, 17:32 Titel: |
|
|
Srysrysry mein Fehler!
Argh war grade gedanklich noch bei Operatoren die ja immer zwei Operanden haben argh
Vielen Dank volta! Gutgut dann muss ich nur noch addieren und subtrahieren können, und alles ist in Butter...
Okay rechtsshift geht genauso nur mit Shr statt shl? Und überall wo xhi steht xlo hin und umgekehrt? (weil ja entgegengesetzt gearbeitet wirdl..) |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 30.09.2008, 18:30 Titel: |
|
|
Beim SHR musst du im Prinzip genau umgekehrt vorgehen: erst xlo shiften, dann, falls (xhi AND 1) = 1, zu xlo das oberste Bit addieren, dann xhi shiften.
Bei der Addition überlege ich noch - wenn beide Zahlen positiv sind und die Summe selbst keinen Überlauf produziert, sollte das funktionieren:
wenn xlo1 + xlo2 < &hffff, dann einfach xloNeu = xlo1 + xlo2; xhiNeu = xhi1 + xhi2.
Ansonsten den Überlauf von (xlo1 + xlo2) merken und anschließend (geshiftet) zu xhiNeu addieren.
Mal sehen, vielleicht probiere ich heute noch ein bisschen herum, kann aber nichts versprechen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 30.09.2008, 18:44 Titel: |
|
|
Das wäre echt super nett von dir!
RICHTIG behindert ist es aber, dass man für RC4 knapp 300 Bytes RAM braucht, und dieses Mistding nur 240 hat, und auch keine Arrays unterstützt - Genausowenig wie Strings, z.B. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 30.09.2008, 19:48 Titel: |
|
|
Dies hier scheint (!) zu funktionieren:
Code: | dim as integer a, b
dim as ushort loA, loB, loS, hiA, hiB, hiS
dim taste as string
randomize timer
do
cls
loA = int(rnd*2^16)
hiA = int(rnd*2^16)
loB = int(rnd*2^16)
hiB = int(rnd*2^16)
a = (hiA shl 16)+loA
b = (hiB shl 16)+loB
print a & " + " & b & " = "; tab(30); a+b ' Ausgabe zur Kontrolle
loA = a and &hffff
hiA = a shr 16
loB = b and &hffff
hiB = b shr 16
loS = loA + loB
hiS = hiA + hiB
if loS < loA or loS < loB then hiS += 1
print "SHORT-weise Addition: "; tab(30); (hiS shl 16) + loS
print "Differenz: " & a+b - (hiS shl 16)-loS
taste = input(1)
loop until taste = chr(27) |
Da es auch mit negativen Zahlen zu klappen scheint, kannst du eine Differenz als Addition mit einer negativen Zahl umschreiben.
edit (20:34 Uhr): kleine Programmcodeänderung, um bessere Zufallszahlen zu erzeugen. RND*2^32 scheint nicht allzu sinnvoll zu arbeiten.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 01.10.2008, 15:20 Titel: |
|
|
Wunderbar, danke! |
|
Nach oben |
|
 |
|