Extracting bits from a float in vba

我是研究僧i 提交于 2021-02-19 08:11:51

问题


How can I extract the bits from a Single variable in vba?

For example, I want to extract bits 23 to 30 and place them into the lowest 8 bits of an integer.


回答1:


For transferring the bit settings of the short variable to an int, the fastest solution is a 'quick and dirty' CopyMemory approach, as seen here.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Bytes As Long)

Public Sub DoubleToIEEE32(ByVal dValue As Double, ByRef nI1 As Integer, ByRef nI2 As Integer)
  Dim fValue As Single
  Dim nInt(1) As Integer

  fValue = CSng(dValue)
  CopyMemory nInt(0), fValue, Len(fValue) ‘ copy from Single to Int Array

  ‘ Internally, the Low Word is word 1 and High Word is word 2.
  ‘ Swap them to make it like the PLC guys do it.
  nI1 = nInt(1)
  nI2 = nInt(0)
End Sub

For reading and writing single bits in integers, see here. The relevant source code is this:

' The ClearBit Sub clears the nth bit (Bit%) 
' of an integer (Byte%).
Sub ClearBit (Byte%, Bit%)
   ' Create a bitmask with the 2 to the nth power bit set:
   Mask% = 2 ^ Bit%
   ' Clear the nth Bit:
   Byte% = Byte% And Not Mask%
End Sub

' The ExamineBit function will return True or False depending on
' the value of the nth bit (Bit%) of an integer (Byte%).
Function ExamineBit% (Byte%, Bit%)
   ' Create a bitmask with the 2 to the nth power bit set:
   Mask% = 2 ^ Bit%
   ' Return the truth state of the 2 to the nth power bit:
   ExamineBit% = ((Byte% And Mask%) > 0)
End Function

' The SetBit Sub will set the nth bit (Bit%) of an integer (Byte%).
Sub SetBit (Byte%, Bit%)
   ' Create a bitmask with the 2 to the nth power bit set:
   Mask% = 2 ^ Bit%
   ' Set the nth Bit:
   Byte% = Byte% Or Mask%
End Sub

' The ToggleBit Sub will change the state of the 
' nth bit (Bit%) of an integer (Byte%).
Sub ToggleBit (Byte%, Bit%)
   ' Create a bitmask with the 2 to the nth power bit set:
   Mask% = 2 ^ Bit%
   ' Toggle the nth Bit:
   Byte% = Byte% Xor Mask%
End Sub


来源:https://stackoverflow.com/questions/9431346/extracting-bits-from-a-float-in-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!