Bit Twiddling Hacks
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...?
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
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.
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.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
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: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.
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

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.

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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...
für FASM gibts doch bestimmt umsonstig ne Doku runterzuladen, gelle?
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...

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.
Der Weise weiß, dass er ein Narr ist.
Hehe, ich mach zur Zeit an der FH ein C64-Projekt mit dem 6502 bzw. 6510 
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.

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.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
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...
Lohnt sich die Mühe überhaupt bzw. kann man ASM evtl. sogar im Beruf gebrauchen?
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...

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
Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51: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).
Da PB nur signed Variablen kennt, nimmt es eben auch bei derAND51 hat geschrieben:// Edit:
Hilfe, was ist hier los?Hier müsste doch 1 das Ergebnis sein?Code: Alles auswählen
one=1 Debug Bin(one<<31>>31)
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)
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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.Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51:


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Tja, nen Bierdeckel auszurechnen ist einfacher.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?
Gruß
Helle

Aber nun weiter den Spezies lauschen...

:::: WIN 10 :: PB 5.73 :: (x64) ::::