buenas, comparto estos codes que hice que me son de mucha utilidad cuando trabajan con bits
'--------------------------Mid de Bits----------------------------------
' obtenemos solamente la cantidad y la posicion de bits que queremos
Function MidBit(DWord As Long, StartB As Byte, LengthB As Byte) As Long
Dim ln As Byte
Dim sleft As Byte
Dim FFFF As Long
ln = LenBi(DWord)
sleft = (ln - StartB) + 1
' Obtemos la mascara creada por los mismo bits
' 1111 1111 1111 1111... ?
Do While sleft
FFFF = (FFFF * 2) + 1
sleft = sleft - 1
Loop
MidBit = FFFF And DWord
MidBit = MidBit \ 2 ^ (ln - ((StartB - 1) + LengthB))
End Function
' By Raul100 no quitar texto
La funcion MIdBit usa la funcion LenBits pueden agregarle el codigo de la funcion lenBits al Midbits tambien...
Algo importante la funcion MidBit trata directamente con los Bits asi que debemos saber cuando bits usa el numero
que introduciremos esta funcion toma en cuenta los 0's a la izquierda ( es normal ) porque obviamente no valen nada.
Tambien algo importante MidBit NO es toma los Bits como Cadenas
Por ejemplo si tenemos este binario:
0000 0010 0010 0000
queremos obtener los Bits que esta en negrita, Obtendremos 10 ( el 0 de la izquierda no vale nada )
eso es de esperarselo :) tambien se puede modificar para que lo obtenga pero no tendria logica :P
lo correcta es que no lo tome :)
'----------------------LenBits--------------------------
' Obtenemos la longitud de bits en "uso"
' LenBits para 32 Bits...
Function LenBi(Bits As Long) As Byte
Dim l As Long: l = 1
Dim c As Byte
'Max = 0000 0000 0000 0000 0000 0000 0000 0000 = 32 Bits
Do
l = l * 2: c = c + 1
If ((&H80000000 / l) And Bits) Then l = 0
Loop While l
LenBi = &H20 - c
End Function
' By Raul100 no quitar texto
La funcion LenBi obtiene el numero de bits en "uso"
por ejemplo el binario:
0000 0001 0101 0010
Obtendremos 9 ( los bits de la izquierda no valen nada )
y es logico y no tendria sentido sino usaramos la de VB :xD
es mas yo creo que asi funciona la funcion real de VB :P creo
las funciones son para 32Bits se pueden modificar para 64Bits usando dos de tipo Longs tambien :)
...
Una funcion mas rapida y facil de entender...
Public Function getMask32(ByVal lMaskLen As Long) As Long
If (lMaskLen And &H80000000) Then Exit Function
If lMaskLen = &H0 Then Exit Function
getMask32 = &H1
If (lMaskLen >= 32) Then
getMask32 = &HFFFFFFFF
Else
Do While (lMaskLen > &H1)
getMask32 = (getMask32 Or (getMask32 * &H2))
lMaskLen = (lMaskLen - &H1)
Loop
End If
End Function
Public Function midBits32(ByVal lLong32 As Long, ByVal lStart As Long, ByVal lLen As Long) As Long
Dim lMaskFirst As Long
If ((lStart Or lLen) And &H80000000) Then Exit Function
If (lStart > 32) Then Exit Function
If (lLen + lStart > 32) Then lLen = (32 - lStart)
If (lLen = &H0) Then Exit Function
midBits32 = (lLong32 And (getMask32((lStart + lLen)) Xor getMask32(lStart)))
End Function
ejemplo:
Private Sub Form_Load()
MsgBox midBits32(&HFF00FF00, 8, 8)
MsgBox midBits32(&HFF00FF00, 24, 8)
MsgBox midBits32(&HFF00FF00, 31, 1)
End Sub
Dulces Lunas!¡.
como funcionan tus funciones a mi no me da :P
digamos la primera el bin:
11111111000000001111111100000000
parametros 8,8
se supone que debe de devolver 1111 1111
devuelve 65280 osea con 0's :P
PD: me equivoque :xD
entonces deberia devolver 0 :P
Solo realiza una mascara desde A de longitud B, en ningun momento cambio el valor de esos bits, es decir, en ningun momento los recorro a la derecha:
11111111000000001111111100000000 con a = 8, b = 8
return:
00000000000000001111111100000000
para que quede igual que la tuya solo le falta dos pasos una potencia y una divicion:
Private Sub Form_Load()
MsgBox midBits32(&HFF00FF00, 8, 8) \ 2 ^ 8
MsgBox midBits32(&HFF00FF00, 24, 8) \ 2 ^ 24
MsgBox midBits32(&HFF00FF00, 31, 1) \ 2 ^ 31 ' // aqui saltara error debido a el 2 potencia 31 = -1
End Sub
Yo cuento por NORMA y por que asi esta en definicion como 0 el menos significativo es decir el que esta a la derecha y tu lo haces alreves...
Private Sub Form_Load()
MsgBox midBits32(&HFF00FF00, 8, 8) \ 2 ^ 8
MsgBox midBits32(&HFF00FF00, 24, 8) \ 2 ^ 24
MsgBox midBits32(&HFF00FF00, 30, 1) \ 2 ^ 30
MsgBox MidBit(&HFF00FF00, 8, 8)
MsgBox MidBit(&HFF00FF00, 24, 8)
MsgBox MidBit(&HFF00FF00, 30, 1)
End Sub
Dulces Lunas!¡.
;-)
me ah gustado tio :)
por otra parte ahora me probad con negativos me e fijado que la mia no funciona con negativos :P
la modificare