32833 "zerlegen" ?

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

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Tom »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von brandelh »

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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von brandelh »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von brandelh »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Martin Altmann »

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: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von brandelh »

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
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von Wolfgang Ciriack »

Hallo Jimmi,
schau dir doch mal die Tools-Funktionen CharAND, CharOR, etc. an.
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: 32833 "zerlegen" ?

Beitrag von brandelh »

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
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: 32833 "zerlegen" ?

Beitrag von AUGE_OHR »

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
Antworten