Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[solved] binäres Addieren - oder: Logik xD

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 29.09.2008, 21:41    Titel: [solved] binäres Addieren - oder: Logik xD Antworten mit Zitat

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, 14:21, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 29.09.2008, 21:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 30.09.2008, 03:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 30.09.2008, 12:25    Titel: Antworten mit Zitat

shl/shr gibt's, aber...
Zitat:
Ich habe auf einer bestimmten Platform keine 32 Bit Integers zur Verfügung

klingt nicht nach FB. happy
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 30.09.2008, 13:48    Titel: Antworten mit Zitat

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 grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 30.09.2008, 16:16    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 30.09.2008, 16:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 30.09.2008, 16:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 30.09.2008, 17:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 30.09.2008, 17:44    Titel: Antworten mit Zitat

Das wäre echt super nett von dir! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 30.09.2008, 18:48    Titel: Antworten mit Zitat

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. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 01.10.2008, 14:20    Titel: Antworten mit Zitat

Wunderbar, danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz