Inoffizielles deutsches Xbase-Forum • Thema anzeigen - 32833 "zerlegen" ?

32833 "zerlegen" ?

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

32833 "zerlegen" ?

Beitragvon AUGE_OHR am Fr, 16. Jul 2010 23:32

hi,
Code: Alles auswählen
NERO_MEDIA_NONE             0
NERO_MEDIA_CD               1
NERO_MEDIA_DDCD             2
NERO_MEDIA_DVD_M            4
NERO_MEDIA_DVD_P            8
NERO_MEDIA_DVD_ANY         12
NERO_MEDIA_DVD_RAM         16
NERO_MEDIA_ML              32
NERO_MEDIA_MRW             64
NERO_MEDIA_NO_CDR         128
NERO_MEDIA_NO_CDRW        256
NERO_MEDIA_CDRW           129
NERO_MEDIA_CDR            257
NERO_MEDIA_DVD_ROM        512
NERO_MEDIA_CDROM         1024
NERO_MEDIA_NO_DVD_M_RW   2048
NERO_MEDIA_NO_DVD_M_R    4096
NERO_MEDIA_NO_DVD_P_RW   8192
NERO_MEDIA_NO_DVD_P_R   16384
NERO_MEDIA_DVD_M_R       2052
NERO_MEDIA_DVD_M_RW      4100
NERO_MEDIA_DVD_P_R       8200
NERO_MEDIA_DVD_P_RW     16392
NERO_MEDIA_FPACKET      32768
NERO_MEDIA_VPACKET      65536
NERO_MEDIA_PACKETW      98368
NERO_MEDIA_HDB         131072
ich habe einen Wert 32833 und die o.g. Konstanten ... wie bekomme ich raus was die "enthält" ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon Tom am Fr, 16. Jul 2010 23:38

Vielleicht geht's noch eleganter, aber m.E. musst Du von der größtmöglichen abwärts bis zur kleinstmöglichen prüfen, ob der Gesamtwert jeweils größer ist. Wenn ja, ist dieser Wert enthalten und muss abgezogen werden, dann geht's weiter. "0" trifft nur zu, wenn der Gesamtwert von vorneherein 0 war.

Was ich allerdings etwas merkwürdig finde und für einen Fehler halte:

Code: Alles auswählen
NERO_MEDIA_DVD_M        4
NERO_MEDIA_DVD_ANY     12
NERO_MEDIA_DVD_RAM     16


12+4 sind 16. Damit lässt sich aus einem möglicherweise zusammengesetzten Gesamtwert nicht mehr ermitteln, ob _M und _ANY gemeint waren oder _RAM. :?: Will sagen: Eine Konstante mit dem Wert 12 darf es hierbei eigentlich nicht geben.

Edit: Vielleicht sind _M und _ANY aber auch gleichzeitig einfach nicht zulässig. Dann wäre ein Rest von 16 immer _RAM.
Herzlich,
Tom
Benutzeravatar
Tom
Foren-Administrator
Foren-Administrator
 
Beiträge: 3815
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am Fr, 16. Jul 2010 23:54

Och Kinners,
das ist doch nun wirklich Pillepalle!
Ihr könnt einen Integer doch einfach Bitweise abfragen!
Code: Alles auswählen
nI := 32833
if nI[6]  // wenn 2^5 gesetzt ist!
...


Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Sa, 17. Jul 2010 0:22

Martin Altmann hat geschrieben:Och Kinners,
das ist doch nun wirklich Pillepalle!
Ihr könnt einen Integer doch einfach Bitweise abfragen!
Code: Alles auswählen
nI := 32833
if nI[6]  // wenn 2^5 gesetzt ist!
...
em, äh ... :?:
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am Sa, 17. Jul 2010 0:34

Jimmy,
über den Arrayoperator können bei einem Integer die einzelnen Bits geprüft werden!
Wenn gesetzt (also 1), dann ist es true.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Sa, 17. Jul 2010 0:41

Tom hat geschrieben:Vielleicht geht's noch eleganter, aber m.E. musst Du von der größtmöglichen abwärts bis zur kleinstmöglichen prüfen, ob der Gesamtwert jeweils größer ist. Wenn ja, ist dieser Wert enthalten und muss abgezogen werden, dann geht's weiter. "0" trifft nur zu, wenn der Gesamtwert von vorneherein 0 war.
hm ... also in etwa so
Code: Alles auswählen
LOCAL aType := MediaType()

   // {NERO_MEDIA_DVD_ANY      ,"NERO_MEDIA_DVD_ANY"     }}
   // sort on #define Constant
   //
   ASORT(aType,,,{|aX,aY| aX[1] < aY[1]})

   nRest := nMedia // 32833
   iMax  := LEN(aType)
   DO WHILE .T.
      IF nRest > 0
      ELSE
         EXIT
      ENDIF
      //
      // if bigger than Max ( new type´s )
      //
      IF nRest > aType[iMax,1]
         cRet  += aType[iMax,2]+CRLF
         nRest -= aType[iMax,1]
         LOOP
      ENDIF
      //
      // find exact
      //
      nPosi := ASCAN(aType ,{|x| x[1] = nRest  } )
      IF nPosi > 0
         IF aType[nPosi,1] = NERO_MEDIA_NONE
            EXIT
         ELSE
            cRet  += aType[nPosi,2]+CRLF
            nRest -= aType[nPosi,1]
         ENDIF
      ELSE
      //
      // find next "bigger"
      //
         nPosi := ASCAN(aType ,{|x| x[1] > nRest  } )
         //
         // last "before"
         //
         IF nPosi-1 > 0
            IF aType[nPosi-1,1] = NERO_MEDIA_NONE
               EXIT
            ELSE
               cRet  += aType[nPosi-1,2]+CRLF
               nRest -= aType[nPosi-1,1]
            ENDIF
         ELSE
            // nPosi = 1
            IF nPosi > 0
               cRet  += aType[nPosi,2]+CRLF
               nRest -= aType[nPosi,1]
            ELSE
               EXIT
            ENDIF
         ENDIF
      ENDIF
   ENDDO

RETURN cRet
Tom hat geschrieben:Was ich allerdings etwas merkwürdig finde und für einen Fehler halte:

Code: Alles auswählen
NERO_MEDIA_DVD_M        4
NERO_MEDIA_DVD_ANY     12
NERO_MEDIA_DVD_RAM     16


12+4 sind 16. Damit lässt sich aus einem möglicherweise zusammengesetzten Gesamtwert nicht mehr ermitteln, ob _M und _ANY gemeint waren oder _RAM. :?: Will sagen: Eine Konstante mit dem Wert 12 darf es hierbei eigentlich nicht geben.

Edit: Vielleicht sind _M und _ANY aber auch gleichzeitig einfach nicht zulässig. Dann wäre ein Rest von 16 immer _RAM.
das ist mir noch gar nicht aufgefallen ... =D>

ich "denke" DVD_RAM ist etwas "anderes"*** als eine "normale" DVD. DVD_RAM enthält aber wohl "normales" DVD, nicht aber umgekehrt.
*** einen DVD_RAM wird anders "geschrieben" und benötigt keine "Finalisierung" d.h. man kann ein DVD_RAM Video "direkt" bearbeiten.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Sa, 17. Jul 2010 1:04

Martin Altmann hat geschrieben:über den Arrayoperator können bei einem Integer die einzelnen Bits geprüft werden!
Wenn gesetzt (also 1), dann ist es true.
ey, booh ... =D>
das die eckigen Klammern für Arrays sind war mir klar, aber das man die [ ] Array "Operator" nennt wüsste ich noch nicht.
deshalb kannte ich auch das
Beispiel - 3
// Array-Operator und numerische Werte
nicht.

hm ...
Martin Altmann hat geschrieben:
Code: Alles auswählen
nI := 32833
if nI[6]  // wenn 2^5 gesetzt ist!
... em, äh ... :help:
... begreifen tue ich es immer noch nicht richtig ... wie soll ich das "binär zerlegen" :?:
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am Sa, 17. Jul 2010 1:43

Ganz einfach:
Nehmen wir mal NERO_MEDIA_DVD_ANY 12
die 12 sind ja 8+4 - also 2^2 und 2^3 - also das 3. und 4. Bit müssen gesetzt sein:
Code: Alles auswählen
if nI[3] .and. nI[4]
...


Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am Sa, 17. Jul 2010 2:02

Und es geht noch einfacher - meiner Meinung nach!
Wenn Du die Zahl in nI abgelegt hast, kannst Du auch einfach mit dem $-Operator prüfen!
Code: Alles auswählen
If 12 $ nI
  // NERO_MEDIA_DVD_ANY


Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon brandelh am Sa, 17. Jul 2010 21:28

Hi,

wenn man immer nur ein Bit abfragen will, ist [] super, aber
mit einem binären UND kann man den Rest am einfachsten prüfen ...

Code: Alles auswählen
if BAnd( nWert, nKonstante )
  ja das geht ;-)
else
  nö, nicht enthalten
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 6240
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: 32833 "zerlegen" ?

Beitragvon brandelh am Sa, 17. Jul 2010 21:40

Tom hat geschrieben:Edit: Vielleicht sind _M und _ANY aber auch gleichzeitig einfach nicht zulässig. Dann wäre ein Rest von 16 immer _RAM.


Hi,

die 4 und die 8 kennzeichnen wohl spezielle Medientypen. Wenn einer davon eingelegt wird, wird der richtige Wert (4 oder 8 oder eventuell beide) gesetzt.
* DVD -> 4, 8 oder 4+8=12 , also DVD ... den Unterschied von 4 und 8 kenne ich nicht, könnte aber mit + oder - zu tun haben.
* DVD-RAM -> 16 somit dürfte es keine Verwechslungen geben.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 6240
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am So, 18. Jul 2010 21:59

Moin,
brandelh hat geschrieben:
Code: Alles auswählen
if BAnd( nWert, nKonstante )
  ja das geht ;-)
else
  nö, nicht enthalten

Hubert - mag gehen, aber das mit dem $ finde ich einfacher. Beispiel folgt gleich.
Tom hat geschrieben:12+4 sind 16. Damit lässt sich aus einem möglicherweise zusammengesetzten Gesamtwert nicht mehr ermitteln, ob _M und _ANY gemeint waren oder _RAM. Will sagen: Eine Konstante mit dem Wert 12 darf es hierbei eigentlich nicht geben.

Edit: Vielleicht sind _M und _ANY aber auch gleichzeitig einfach nicht zulässig. Dann wäre ein Rest von 16 immer _RAM.

Tom, keine Sorge! 16 ist was anderes, als 12+4! Beides (also 12 und 4) kann nämlich nicht gleichzeitig eintreten! Denke mal an die Binärzahlen - wenn Du 12 binär darstellst, hast Du das Bit 2^3 und 2^2 gesetzt! Da kannst Du also das 2^2 nicht nochmal setzen - würdest Du das tun, gäbe es einen Überlauf. Und da 2^3 auch schon gesetzt war, wird dann 2^4 gesetzt - und das ist 16! Aber die beiden anderen Bits sind dann nicht mehr gesetzt - also weder NERO_MEDIA_DVD_M noch NERO_MEDIA_DVD_ANY!

Code: Alles auswählen
NERO_MEDIA_NONE             0
NERO_MEDIA_CD               1
NERO_MEDIA_DDCD             2
NERO_MEDIA_DVD_M            4
NERO_MEDIA_DVD_P            8
NERO_MEDIA_DVD_ANY         12
NERO_MEDIA_DVD_RAM         16
NERO_MEDIA_ML              32
NERO_MEDIA_MRW             64
NERO_MEDIA_NO_CDR         128
NERO_MEDIA_NO_CDRW        256
NERO_MEDIA_CDRW           129
NERO_MEDIA_CDR            257
NERO_MEDIA_DVD_ROM        512
NERO_MEDIA_CDROM         1024
NERO_MEDIA_NO_DVD_M_RW   2048
NERO_MEDIA_NO_DVD_M_R    4096
NERO_MEDIA_NO_DVD_P_RW   8192
NERO_MEDIA_NO_DVD_P_R   16384
NERO_MEDIA_DVD_M_R       2052
NERO_MEDIA_DVD_M_RW      4100
NERO_MEDIA_DVD_P_R       8200
NERO_MEDIA_DVD_P_RW     16392
NERO_MEDIA_FPACKET      32768
NERO_MEDIA_VPACKET      65536
NERO_MEDIA_PACKETW      98368
NERO_MEDIA_HDB         131072

Zu den o.g. Defines ist folgendes Beispiel am deutlichsten:
Code: Alles auswählen
nI := 32833
if NERO_MEDIA_FPACKET $ nI
....
elseif ...

Wenn also die Bits, die bei der Darstellung der Dezimalzahl 32768 in der binären Zeichendarstellung gesetzt sind, auch bei der Zahl nI (also 32833) gesetzt sind, dann wird der Vergleich true liefern!
Ergo liefern
Code: Alles auswählen
? ( 8 $ 12 ) // true
? ( 4 $ 12 ) // true
? ( 8 $ 16 ) // false

Jimmy, Du musst dann nur aufpassen, wenn Du nach NERO_MEDIA_DVD_ANY prüfst! Wenn das nämlich true liefert, dann sind auch NERO_MEDIA_DVD_M und NERO_MEDIA_DVD_P enthalten! Also musst Du Deine Prüfung in den Fällen ggf. aufeinander aufbauend durchführen:
Code: Alles auswählen
if NERO_MEDIA_DVD_ANY $ nI
....
elseif NERO_MEDIA_DVD_M $ nI
....
elseif NERO_MEDIA_DVD_P $ nI
...

Analog gilt das natürlich auch für die anderen Doppelungen (NERO_MEDIA_CDRW und NERO_MEDIA_NO_CDR mit NERO_MEDIA_CD, NERO_MEDIA_CDR und NERO_MEDIA_NO_CDRW mit NERO_MEDIA_CD, usw.)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon brandelh am So, 18. Jul 2010 23:18

Hallo Martin,

dass $ auch binäre Vergleiche bei Zahlen macht, damit hätte ich nicht gerechnet =D> =D>

unter clipper musste man halt den größten Teiler (2^n) ermitteln und durch 2^x eine Teilerschleife bauen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 6240
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am So, 18. Jul 2010 23:22

Yup - so war das früher einmal... :wink:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Di, 20. Jul 2010 1:21

hi,

danke erst mal für die Beiträge, so langsam habe ich es begriffen.
Code: Alles auswählen
#DEFINE NERO_MEDIA_DVD_P_R9    262144
#DEFINE NERO_MEDIA_DVD_ANY     262172
die Konstante in der .CH hat andere Werte als mein "generiertes" Help File und auch DVD9 Format.

... so nun muss ich nur noch raus bekommen "was" jedes der Konstanten mir "sagen" will ... uns "wie" ich es einsetzten soll ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Di, 10. Aug 2010 4:33

hi,

nun wollte ich es "anders-rum" probieren und habe ein Problem :?:
Code: Alles auswählen

STATIC FUNCTION WertType()
LOCAL aType := { ;
{ 0**2 ,"~A   " },;
{ 1**2 ,"~B   " },;
{ 2**2 ,"~C   " },;
{ 3**2 ,"~D   " },;
{ 4**2 ,"~E   " },;
{ 5**2 ,"~F   " },;
{ 6**2 ,"~G   " },;
{ 7**2 ,"~H   " },;
{ 8**2 ,"~I   " },;
{ 9**2 ,"~J   " },;
{10**2 ,"~K   " },;
{11**2 ,"~L   " },;
{12**2 ,"~M   " },;
{13**2 ,"~N   " },;
{14**2 ,"~O   " },;
{15**2 ,"~P   " },;
{16**2 ,"~Q   " },;
{17**2 ,"~R   " },;
{18**2 ,"~S   " },;
{19**2 ,"~T   " },;
{20**2 ,"~U   " }}
RETURN aType

STATIC FUNCTION WhatWert(nMode)
LOCAL cRet  := ""
LOCAL cMode := LTRIM(STR(nMode))
LOCAL aType := WertType()
LOCAL nPosi := 0
LOCAL nRest := 0
LOCAL i,iMax
//
// bei {|x| nRest $ x[1] } von Max nach Min
//
   ASORT(aType,,,{|aX,aY| aX[1] > aY[1]})

   nRest := nMode

   DO WHILE .T.
      IF nRest > aType[1,1]
        nRest -= aType[1,1]
*? " *",aType[1,2],nRest
      ELSE
         EXIT
      ENDIF
   ENDDO

   iMax  := LEN(aType)
   FOR i = 1 TO iMax
      IF nRest > 0
      ELSE
         EXIT
      ENDIF
     IF aType[i,1] $ nRest
*? "**",aType[i,2],nRest
        cRet  += aType[i,2]+CRLF
        nRest -= aType[i,1]
      ENDIF
   NEXT

RETURN cRet
wenn ich nun B (1**2) und C (2**2) "ankreuze" erhalte ich D (3**2) ... :(
und was nun ... :-k
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon Martin Altmann am Di, 10. Aug 2010 8:32

Jimmy,
kein Wunder, Du musst ja auch 2^x nehmen und nicht x^2 :!: Wir sind doch hier bei den Dualzahlen, und nicht bei den Quadranten!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Berlin/Brandenburg
Mitglied der XUG Osnabrück
2. Vorsitzender des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 7620
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon brandelh am Di, 10. Aug 2010 15:03

brandelh hat geschrieben:Hallo Martin,
dass $ auch binäre Vergleiche bei Zahlen macht, damit hätte ich nicht gerechnet =D> =D>
unter clipper musste man halt den größten Teiler (2^n) ermitteln und durch 2^x eine Teilerschleife bauen.


heute war ich mutig ...

Code: Alles auswählen
if ::sleLand $ ::aEditControls
     msgbox("Super es geht")
   else
      msgbox("Nö-wie immer")
   endif


auch das funktioniert, also braucht man keine ASCAN()>0 mehr basteln :D
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 6240
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Di, 10. Aug 2010 18:05

Martin Altmann hat geschrieben:kein Wunder, Du musst ja auch 2^x nehmen und nicht x^2 :!: Wir sind doch hier bei den Dualzahlen, und nicht bei den Quadranten!
em ... äh ... peinlich ... :withstupid:

ich habe das nicht so mit Dualzahlen ... mein Abacus kann das nicht ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Do, 12. Aug 2010 5:23

hi,

nachdem ich von Martin "gelernt" habe 2^x zu benutzen klappt alles wunderbar =D>

wenn ich U2BIN() verwende kann ich von 2^1 bis 2^32 ( 4294967265 ) alles in einem "C",4 Feld speichern.
Der Index läuft nun über Bin2u(FIELD->BEWERT) und ich mache ein SEEK( nNum ) und habe dann alle Titel mit den gewünschten Eigenschaften im Browser :)

jetzt will ich "mehr" ... ;)

ich kann ja nun 30 Eigenschaften anwenden ... aber was wäre mit 100 ?
2^100 kann man wohl nicht unter 32bit und ein 128Bit OS() haben wir ja auch noch nicht in Sicht.

Ich kann aber durchaus ein "C",200 Feld haben und dort
Code: Alles auswählen
FELD C,200  101010111010101...............................................011010
drin stehen haben ...

Frage : könnte man die Array Operator auch für solche String´s einsetzten ?

Da ich ja den "$" Operator benutzen kann, "denke" ich das es gehen müsste.

Frage : em ... äh ... wie "addiere" ich 2 solche String´s ?

Numerisch wird es ja nicht mehr gehen wenn > 2^32 ... ?

wie wäre nun die #define (könnte auch ein Array oder DBF sein)
Code: Alles auswählen
#define AA 0000000000..................................................000000001
#define BB 0000000000..................................................000000010
#define CC 0000000000..................................................000000100
...
wenn ich also die Eigenschaften AA,BB und CC suche müsste ich nach
Code: Alles auswählen
cSeek  := "0000000000..................................................000000111"
suchen ? ... oder fängt man "links" an ?

auch sieht mir das so aus als wenn ein SCOPE dann "passen" müsste ?

Kommentare und Anmerkungen zu der Idee erwünscht.

p.s. ich wundere mich selbst das ich jetzt erst auch die "binär Eigenschaften" gekommen bin.
Dieser "Ersatz" ist ein "perfekter" SET FILTER wenn man "nur" .T./.F. , also nach "Eigenschaften" sucht.
Die Aufbereitung, für einen Report, geht erheblich schneller als wenn ich
Code: Alles auswählen
IF ( a .AND. b .AND. c .AND. ... )
verwenden würde.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Do, 12. Aug 2010 19:11

hi,

sieht so aus als wenn ich erst ein Demo schreiben müsste damit ihr das Potenzial eines "binären Filter" erkennt :idea: :?:
Frage : em ... äh ... wie "addiere" ich 2 solche String´s ?
hm ... es gibt ja nur 1 und 0 ... .T./.F. und wenn einer 1 ist die 0 "egal" ?
Code: Alles auswählen
a := "010101010101010..............."
b := "111100000111111..............."
a+b -> c
c := "111101010111111..............."
stimmt das "so" ?
oder fängt man "links" an ?
ich kann ja bei > 2^32 eh nicht mehr mit "Nummern" arbeiten und wenn ich den String "durchgehe" dann doch so:
Code: Alles auswählen
LOCAL i,iMax

   iMax := LEN(cString1)
   FOR i :=1 TO iMax
         IF       SUBSTR(cString1,i,1) = "1"   // -> "1"
         ELSEIF SUBSTR(cString2,i,1) = "1"   // -> "1"
         ELSE
         ...     // -> "0" 
         ENDIF
   NEXT
klar würde auch iMax STEP -1 gehen ... also "links" oder "rechts" ?

Frage : bislang wäre es ja immer eine .AND. Verknüpfung ... kann man binär "so" auch .OR. oder .NOT. "vergleichen" ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon Wolfgang Ciriack am Do, 12. Aug 2010 21:32

Hallo Jimmi,
schau dir doch mal die Tools-Funktionen CharAND, CharOR, etc. an.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
1000 working lines a day
1000 working lines a day
 
Beiträge: 781
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Fr, 13. Aug 2010 0:37

Wolfgang Ciriack hat geschrieben:schau dir doch mal die Tools-Funktionen CharAND, CharOR, etc. an.
aah, ja ... das sieht du ganz gut aus ... mal sehen was man damit machen kann, Danke !
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: 32833 "zerlegen" ?

Beitragvon brandelh am Fr, 13. Aug 2010 9:01

Hi,

die Tools brauchst du nicht. Du kannst mit cString[x] jedes Bit setzen oder löschen wie du es brauchst und du kannst Strings mit den Funktionen
BAnd(), BOr() und BXOr() miteinander mischen !
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 6240
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: 32833 "zerlegen" ?

Beitragvon AUGE_OHR am Fr, 13. Aug 2010 16:16

brandelh hat geschrieben:Du kannst mit cString[x] jedes Bit setzen oder löschen wie du es brauchst und du kannst Strings mit den Funktionen BAnd(), BOr() und BXOr() miteinander mischen !
aah, mit BAnd() hab ich schon mal gearbeitet ( Ownerdraw ), die beiden anderen kannte ich noch nicht.
ok dann werde ich mir mal die Functionen ansehen wie ich die einsetzen kann, Danke.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 4402
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg


Zurück zu Newbie

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot] und 1 Gast

cron