05-12-2015 03:07 AM
Hallo,
ich habe Schwierigkeiten die "GetB-Funktion" bei Zahlen die größer als 2^31 zu nutzen.
Ich habe ein Statussignal, das insgesamt 4-Bytes lang ist, wovon jedes Bit einen Schaltzustand anzeigen soll. Sehe ich mir das gesamte Signal im "View" an, ist es scheinbar plausibel. Es verändert im Messverlauf mehrfach seine Werte.
Wenn ich nun aber jedes einzelne Bit über die GETB-Funktion auslesen möchte, ist jeder Kanal immer 1 (ausser ausgerechnet Bit31, das ist immer 0). Der Minimalwert des Messkanals beträgt 2.418016265E+09 und ist damit größer als 2^31.
Tippe ich stichprobenartig verschiedenen Werte des Messkanals in den Win7-Taschenrechner ein und lasse mir die zugehörige Binärzahl anzeigen, sind der Werte ebenfalls plausibel.
Auch das der Messkanal im View korrekt angezeigt wird, die GetB-Auswertung jedoch fehlerhaft ist, ist für mich etwas irritierend.
Weder wenn ich die CLRB-Funktion nutze (lösche Bit31), noch wenn ich erst eine Stelle nach links und dann eine Stelle nach rechts "Shifte", komme ich im Anschluß daran an plausible "GetB"-Werte.
Ich habe leider keinen Ansatz wie ich das Problem elegant für alle Zeit umgehen kann.
Danke für eure Mithilfe!
Solved! Go to Solution.
05-12-2015 04:10 AM
Can you give an example where it fails
Option Explicit dim a : a = 2418016265.0 dim txt : txt = "dbl: " & a & VBCRLF & VBCRLF dim i : for i = 31 to 0 step -1 txt = txt & GetB(a, i) Next MsgBox txt
looks reasonable to me.
dbl: 2418016265
10010000001000000000000000001001
05-12-2015 04:19 AM
Hi,
danke für schnelle Antowort!
Anbei ein Screenshot deines Makros...
05-12-2015 04:19 AM
*Antwort
05-12-2015 04:21 AM
Das würde meiner Ansicht nach bedeuten, dass ich doch eine wesentliche Grundeinstellung falsch getroffen, oder gar nicht berücksichtigt habe.
oder?
05-12-2015 04:56 AM - edited 05-12-2015 05:03 AM
I checked with 2015 32bit/64bit version where it works.
With the following normalization at least 31 bits can be extracted with older versions.
Option Explicit dim a : a = 2418016265.0 a = a - CLng(a / 2^31) * 2^31 dim txt : txt = "dbl: " & a & VBCRLF dim i : for i = 31 to 0 step -1 txt = txt & GetB(a, i) Next MsgBox txt
dbl: 270532617
00010000001000000000000000001001
05-12-2015 05:43 AM
Hallo,
diese Autosequenz liefert bei mir (Vers. 2012, 32bit) das gleiche Ergebnis.
Es funktioniert!
Warum man diesen Umweg gehen muss, ist mir zwar nicht ganz klar, aber das Ergebnis stimmt jedenfalls.
Danke!