Si consideramos un word como un conjunto de 16 bits, podemos usar estas funciones:
Public Function HIWORD(L As Long) As Long
HIWORD = (L And &HFF00&) \ &H100&
End Function
Public Function LOWORD(L As Long) As Long
LOWORD = L And &HFF&
End Function
Para saber si un bit está puesto o no, utiliza la siguiente función, que devolverá True o False:
Function BitOn(Word As Long, Bit As Long) As Boolean
If Word And 2 ^ (Bit - 1) Then
BitOn = True
Else
BitOn = False
End If
End Function
Los datos que tienes que pasar son Word y la posición del bit que buscas (1=1, 2=2, 3=4, 4=8, etc).
Para poner o quitar un bit en un Word:
Function SetBit(Word As Long, Bit As Long, Pos As Boolean) As Long
If Pos Then
SetBit = Word Or 2 ^ (Bit - 1)
Else
SetBit = Word - (Word And 2 ^ (Bit - 1))
End If
End Function
Para rotar hacia la izquierda o hacia la derecha una palabra de 16 bits, te envío las siguientes funciones, que usé en la implementación de RC2:
Private Function RolWord(ByVal lVal As Long, Pos As Long) As Long
Dim N As Long, lPos As Long
For N = 1 To 16
lPos = N + Pos
If lPos > 16 Then lPos = lPos - 16
RolWord = RolWord + IIf(CBool(lVal And 2 ^ (N - 1)), 1, 0) * (2 ^ (lPos - 1))
Next
End Function
Private Function RorWord(ByVal lVal As Long, Pos As Long) As Long
Dim N As Long, lPos As Long
For N = 1 To 16
lPos = N - Pos
If lPos < 1 Then lPos = lPos + 16
RorWord = RorWord + IIf(CBool(lVal And 2 ^ (N - 1)), 1, 0) * (2 ^ (lPos - 1))
Next
End Function
Alvaro Redondo <merlin@sevillaonline.com>