[Sources Code] MidBit + LenBi [Nivel de bit]

Iniciado por x64core, 28 Octubre 2011, 23:35 PM

0 Miembros y 1 Visitante están viendo este tema.

x64core


buenas, comparto estos codes que hice que me son de mucha utilidad cuando trabajan con bits


Código (VB) [Seleccionar]


'--------------------------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 :)



Código (VB) [Seleccionar]

'----------------------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 :)





BlackZeroX

#1
...
Una funcion mas rapida y facil de entender...

Código (vb) [Seleccionar]


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:

Código (vb) [Seleccionar]


Private Sub Form_Load()
    MsgBox midBits32(&HFF00FF00, 8, 8)
    MsgBox midBits32(&HFF00FF00, 24, 8)
    MsgBox midBits32(&HFF00FF00, 31, 1)
End Sub



Dulces Lunas!¡.
The Dark Shadow is my passion.

x64core

#2
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

BlackZeroX

#3
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:

Código (Vb) [Seleccionar]


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...

Código (Vb) [Seleccionar]


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!¡.
The Dark Shadow is my passion.

x64core

 ;-)
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