Aktuelle Zeit: 16.01.2021 07:21

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 24.11.2020 17:37 
Offline
Benutzeravatar

Registriert: 14.12.2008 12:22
Noch ein Zusatz zur Frage, wozu: Bitmasks bzw. Bitboards. Beim Schach werden sie z.B. häufig benutzt. Jedes der 64 Felder repräsentiert ein Bit in einem 64-Bit-Integer. Mehrere dieser Bitmasks repräsentieren dann eine Stellung. Eine zeigt z.B. alle weißen Figuren an, eine zeigt alle Läufer an, ect... Die möglichen Züge können mit Bit-Operationen und zuvor berechneten Bitmasks deutlich schneller berechnet werden.
Unsigned quads wären da schon recht hilfreich. Allerdings fehlt PureBasic eine andere entscheidene Sache, die Java z.B. hat, den "unsigned right shift operator". Dieser muss leider emuliert werden, was den Geschwindigkeitsvorteil wieder etwas dämpft.
Code:
test.l = %11000000000000000000000000000000
Debug Bin(test, #PB_Long)   ; 11000000000000000000000000000000
testa.l = test >> 1
Debug Bin(testa, #PB_Long)  ; 111000000000000000000000000000000    (die erste 1 ist eigentlich falsch)
;testb.l = test >>> 1   ; Gibt es leider nicht
;Debug Bin(testb, #PB_Long) ; 011000000000000000000000000000000

_________________
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite

padawan hat geschrieben:
Ich liebe diese von hinten über die Brust ins Auge Lösungen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 24.11.2020 18:52 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
>> "Jedes der 64 Felder repräsentiert ein Bit in einem 64-Bit-Integer."
Das war also der wahre Grund für den Technologiesprung von 32 nach 64 bit, wegen Schach :lol:
Interessanter Ansatz.

Zum echten Right Shift, muss man halt ASM nutzen, was aber nicht langsamer ist.
Code:
test.l = %11000000000000000000000000000000
Debug Bin(test, #PB_Long)   ; 11000000000000000000000000000000
testa.l = test >> 1
Debug Bin(testa, #PB_Long)  ; 111000000000000000000000000000000    (die erste 1 ist eigentlich falsch)
Define testb.l
! MOV eax, dword [v_test]
! SHR eax, 1
! MOV dword [v_testb], eax
Debug RSet(Bin(testb, #PB_Long), 32, "0") ; 011000000000000000000000000000000

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 24.11.2020 19:05 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Für ein unsigned shift gibt es immerhin einen ASM-Befehl, den man mit Inline-Assembler leicht einbauen kann. Aber frag mich nicht wie. :lol:

Edit: Oh, zu langsam.

@STARGATE: Da du grad hier bist. Kannst du mir erklären, was Purebasic hier macht?
Code:
; Define vara.l = var >> 1
  MOVSXD r15,dword [v_var]
  SAR    r15,1
  MOV    rax,r15
  PUSH   rax
  POP    rax
  MOV    dword [v_vara],eax

Was ist an MOVSXD so besonders, warum muss es in r15 und was soll das PUSH und POP da überhaupt? Das sieht alles so unnötig aus.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 24.11.2020 20:06 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Das Push Pop ist irgendwie unnötig ja. Aber durch den One-Pass-Compiler gibt es vermutlich keine Optimierungsroutine.
Da hier mit x64 Register gearbeitet wird (weil es die Wortgröße des Prozessors ist),
muss das Vorzeichen von der Long "erweitert" werden (MOV Sign eXtension Doubleword) damit das SAR richtig funktioniert,
sonst würde SAR ja ein 0-Bit reinschieben.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 24.11.2020 20:49 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Schon in ASM Fertig 8)
Link: Bitshift and Rotation

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 25.11.2020 20:26 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Hi!

Ich habe da mal ne Frage dazu.

Ist das MOVSXD nicht extra für negative Zahlen gedacht ?

Ist das hier dann bei negativen Zahlen nicht falsch?

Beispiel:
Code:
Procedure SHL32(value.l, count.l = 1);    Bitshift left shift

   !mov eax, dword [p.v_value]
   !mov ecx, dword [p.v_count]
   !shl eax, cl
   ProcedureReturn

EndProcedure
Procedure SHR32(value.l, count.l = 1);    Bitshift right shift

   !mov eax, dword [p.v_value]
   !mov ecx, dword [p.v_count]
   !shr eax, cl
   ProcedureReturn

EndProcedure

Procedure RShift()
!  MOVSXD r8, dword [v_var]
!  SAR    r8,1
!  MOV    rax,r8
; !  PUSH   rax
; !  POP    rax
!  MOV    dword [v_vara],eax
EndProcedure

Define.l var = -16 ;Negative Zahl
Define vara.l ; = var >> 1

Debug var >> 1 ;Bin(var >> 1)
Debug SHR32(var, 1) ;Bin(SHR32(var, 1)) ;Negativ ?

RShift()
Debug vara ;Bin(vara)

_________________
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 25.11.2020 23:08 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
SHR32 oder SHR64 ist ein Unsigned schrieben rechts. Braucht man manchmal ...
Code:
Procedure SHL32(value.l, count.l = 1);    Bitshift left shift

   !mov eax, dword [p.v_value]
   !mov ecx, dword [p.v_count]
   !shl eax, cl
   ProcedureReturn

EndProcedure
Procedure SHR32(value.l, count.l = 1);    Bitshift right shift

   !mov eax, dword [p.v_value]
   !mov ecx, dword [p.v_count]
   !shr eax, cl
   ProcedureReturn

EndProcedure

lVal.l = $F234F567

; Swap words
Debug Hex(lVal, #PB_Long)
lVal = SHR32(lVal, 16) | SHL32(lVal, 16)
Debug Hex(lVal, #PB_Long)



MOVSXD kümmert sich darum das Signed Werte richtig geladen werden. Also von ein Signed DWord nach ein Signed QWord
Wenn also das Signed Bit auf 1 ist (Negativer Wert) werden alle Bits im automatisch gefüllt, damit dieser eine negativer Wert bleibt.

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Warum kann PB kein unsigned long bzw. int ?
BeitragVerfasst: 26.11.2020 20:45 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Code:
; Bitshift right shift
Procedure.q SHR64(value.q, count.q = 1);   Bitshift right shift
 
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
    !mov rax, qword [p.v_value]
    !mov rcx, qword [p.v_count]
    !shr rax, cl
    ProcedureReturn
  CompilerElse
    Protected v1.q
    v1 = ~($FFFFFFFFFFFFFFFF << (64-count))
    ProcedureReturn value>>count & v1
  CompilerEndIf
 
EndProcedure

Define.q ts = %0110010101101011011011100110000101000100100

ts = SHR64(ts, #PB_Date_Day)
Debug PeekS(@ts, 5, #PB_Ascii)


_________________
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye