DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

GetB-Funktion bzw. 32Bit Dezimalwert

Solved!
Go to solution

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!

0 Kudos
Message 1 of 7
(5,518 Views)

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

 

0 Kudos
Message 2 of 7
(5,510 Views)

Hi,

danke für schnelle Antowort!

Anbei ein Screenshot deines Makros...

0 Kudos
Message 3 of 7
(5,506 Views)

*Antwort

0 Kudos
Message 4 of 7
(5,505 Views)

Das würde meiner Ansicht nach bedeuten, dass ich doch eine wesentliche Grundeinstellung falsch getroffen, oder gar nicht berücksichtigt habe.

oder?

0 Kudos
Message 5 of 7
(5,504 Views)
Solution
Accepted by topic author Papabaer1608

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

0 Kudos
Message 6 of 7
(5,497 Views)

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!

0 Kudos
Message 7 of 7
(5,488 Views)