Bit Twiddling Hacks

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Signed Shifts?
Was ist das? Heißt das, wenn das Vorzeichenbit (das ganz links) 1 ist, wird das Ergebnis beim rechts-shifting nicht vorgenullt, sondern "vorge-einst"?

Was macht das für einen Sinn, bringt das Vorteile?

Wenn das nämlich ein zusätzliches &1 erfordert, bedeutet das ja für die CPU einen zusätzlichen Arbeitsschritt mehr, sodass sich die Arbeit hier gar nicht lohnt...?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Das erfordert eben kein zusätzliches &1, weil es auch hierfür wieder eine fertige Operation gibt (SAR, zusätzlich zum normalen SHR).

Man darf da nicht denken daß jeder einzelne Schritt berücksichtigt werden muß, es gibt für vieles mehrere Operationen. Genau wie bei den Jump-Befehlen, da käme man theoretisch auch mit weitaus weniger aus, und dennoch gibt's da für jede erdenkliche Kombination einen eigenen Befehl.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

OK, funktionieren tut's ja auch ohne &1, ich bekomme ja wie gewünscht -1 für negative und 0 für positie Zahlen.
Aber der Term 1<<31>>31 hat mich schon überrascht, weil das ja nach "normalem" Verständnis wieder 1 ergeben soll(te).

Ich wusste das mit den Signed Shifts nicht, sonst hätte ich das Kaeru Gaman sofort erklären können.

@ Kaeru:

Code: Alles auswählen

v=-5
sign = 1|v>>31
Ich erkläre es dir: :)

Zunächst wird das Vorzeichenbit (jenes ganz links) ganz nach rechts verschoben.
Normalerweise wäre das Ergebnis in PB-Schreibweise jetzt %1.
Durch den erwähnten signed Shift wird %1 aber nicht vorgenullt, sondern mit Einsen aufgefüllt.
Das bedeutet, dass das Ergebnis %11111111111111111111111111111111 (32 Einsen) ist.
Das Vorzeichenbit ganz links bleibt also 1. Und wenn das Vorzeichenbit TRUE ist, dann ist die Zahl negativ.

Zum Schluss wird noch |1 angewendet. Das bitweise Oder. Da das ganz rechte Bit im Ergebnis aber 1 ist, hat das |1 keine Wirkung, das Ergebnis bleibt TRUE.

Somit erhalten wir als Resultat -1.



Zum besseren Versändnis mit einer positiven Zahl:
5 = %101 = %00000000000000000000000000000101
Zunächst der Rechtsschift:
%00000000000000000000000000000101>>31 = %0.
Mit anderen Worten: die Null, also das Vorzeichenbit wird nach rechts geholt. Das Ergebnis ist 0. Hier kommt das singed Shifting nicht zum Tragen, da das Vorzeichenbit beim Rechtsshifting FALSE ist.

Zum Schluss noch |1 drüberziehen: 0|1 ergibt 1.



Alles ok?
q.e.d. :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja ich hab nicht ans signed shift gedacht (hatte das vor ner weile schon mal),
sonst wär ich auch so drauf gekommen.

...kann ich mich irgendwie nicht dran gewöhnen, dass PB nicht unsigned shiftet...

sollte mir endlich mal ausgiebig aktuellen Assembler reinziehn...
seit dem 6502 / 6510 hab ich kein Assembler mehr geproggt.
hatte mal ne Befehlsreferenz für nen 80286 durchgeblättern, das ist nicht ganz dasselbe... :lol:

für FASM gibts doch bestimmt umsonstig ne Doku runterzuladen, gelle?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Hehe, ich mach zur Zeit an der FH ein C64-Projekt mit dem 6502 bzw. 6510 :mrgreen:

Zum Thema signed/unsigned shiften: unter Java gibt's dafür 3 Operatoren, nämlich <<, >> und >>>. Möglicherweise könnte man sowas für PB ja auch einführen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Assembler?
Ich hoffe, das wird nicht zu offtopic, aber gibt es Arbeitsmaterial bzw. Tutorials, mit denen ich ASM auch kennen und nutzen lernen kann?
Speziell dann auch, wie man (F)ASM in PB einsetzen kann.
Ich habe schon mal einen derartigen EInstieg probiert, hängen geblieben ist nur noch was mit den EAX bis EDX Registern, sowie INC und DEC... :oops:
Lohnt sich die Mühe überhaupt bzw. kann man ASM evtl. sogar im Beruf gebrauchen?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Bin grad ausser Kneipe zurück und schau hier mal wieder rein. Jungs, seid ihr sicher zu wissen, von was ihr redet :mrgreen: ?

Gruß
Helle
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

ZeHa hat geschrieben:Das erfordert eben kein zusätzliches &1, weil es auch hierfür wieder eine fertige Operation gibt (SAR, zusätzlich zum normalen SHR).
Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51:
AND51 hat geschrieben:// Edit:
Hilfe, was ist hier los?

Code: Alles auswählen

one=1
Debug Bin(one<<31>>31)
Hier müsste doch 1 das Ergebnis sein?
Da PB nur signed Variablen kennt, nimmt es eben auch bei der
Rechtsverschiebung SAR, wo das oberste Bit nicht mit 0 aufgefüllt
wird, sondern mit dem Vorzeichenbit des Operanden.
War das Vorzeichenbit 1, wird auch wieder mit 1 aufgefüllt.

Was AND51 wollte, war allerdings wieder was ganz anderes -
ich dachte er möchte 1 für Zahlen <0 raushaben, sonst 0.

Code: Alles auswählen

Macro SignL(a)
  ((a>>31)&1)
EndMacro

a = -10
x = SignL(a)
...wäre halt eine Abkürzung für:

Code: Alles auswählen

a = -10
If a < 0
  x = 1
Else
  x = 0
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51:
Hab doch gar nix anderes behauptet. Aber AND51 hat ja gefragt ob ein Right Shift mit Vorzeichen ein zusätzliches &1 benötigt (und somit länger dauert), und ich habe ihm lediglich gesagt, daß die CPU dafür eine eigene Operation kennt. Hat doch mit PB oder ASM nix zu tun, wenn PB nur mit Vorzeichen shiften kann, dann wird es wohl SAR benutzen und nicht SHR. So war das gemeint.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Helle hat geschrieben:Bin grad ausser Kneipe zurück und schau hier mal wieder rein. Jungs, seid ihr sicher zu wissen, von was ihr redet :mrgreen: ?

Gruß
Helle
Tja, nen Bierdeckel auszurechnen ist einfacher. :mrgreen: Mir ist das auch zu hoch, was aber völlig egal ist. Solange man auch ohne Verknotungen und Verrenkungen im Kopf zum Ziel kommt.

Aber nun weiter den Spezies lauschen... <)
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Antworten