Recopilacion de Funciones con operaciones Binarias.
BlackZeroX:
Bueno ya sabemos que las funciones con operaciones binarias son mas rápidas y mas practicas a la hora de ejecutarse.
La intención de este tema es que se creen una sola publicacion donde se pueden encontrar estas funciones de manera amena.
Código
' // Para valores tipo Long
Private Sub lSwap(ByRef lVal1 As Long, ByRef lVal2 As Long)
' // Intercambia {lVal1} por {lVal2} y {lVal2} a {lVal1} sin variable temporal
lVal1 = lVal1 Xor lVal2
lVal2 = lVal2 Xor lVal1
lVal1 = lVal1 Xor lVal2
End Sub
Private Function lIsNegative(ByRef lVal As Long)
' // Para cualquier valor que lVal pueda tomar.
' // Comprueba si lval es negativo.
lIsNegative = (lVal And &H80000000)
End Function
Private Function iIsNegative(ByRef iVal As Integer) As Boolean
' // Para cualquier valor que iVal pueda tomar.
' // Comprueba si lval es negativo.
iIsNegative = (iVal And 32768)
End Function
Private Sub iSwap(ByRef iVal1 As Integer, ByRef iVal2 As Integer)
' // Intercambia {iVal1} por {iVal2} y {iVal2} a {iVal1} sin variable temporal
iVal1 = iVal1 Xor iVal2
iVal2 = iVal2 Xor iVal1
iVal1 = iVal1 Xor iVal2
End Sub
Private Sub bSwap(ByRef iVal1 As byte, ByRef iVal2 As byte)
' // Intercambia {iVal1} por {iVal2} y {iVal2} a {iVal1} sin variable temporal
iVal1 = iVal1 Xor iVal2
iVal2 = iVal2 Xor iVal1
iVal1 = iVal1 Xor iVal2
End Sub
Function max(ByVal val1 As Long, ByVal val2 As Long) As Long
If (val1 > val2) Then
max = val1
Else
max = val2
End If
End Function
Function min(ByVal val1 As Long, ByVal val2 As Long) As Long
If (val1 > val2) Then
min = val2
Else
min = val1
End If
End Function
Function bSwapBit(ByVal myLong As Long, ByVal bit1 As Byte, ByVal bit2 As Byte) As Long
' Los bits se CUENTAS DE DERECHA A IZQUIERDA es decir: 31, 30, ... , 3, 2, 1, 0
' Solo se admite rango 0 al 31.
Dim aux As Long
Dim mask As Long
aux = max(bit1, bit2)
bit2 = min(bit1, bit2)
bit1 = aux ' max
Debug.Assert (bit1 > 31) ' No se permiten numero mayores a 32
Debug.Assert (bit2 < 0) ' No se permiten valores negativos
mask = Not ((2 ^ bit1) Or (2 ^ bit2))
aux = (2 ^ (bit1 - bit2))
bSwapBit = (myLong And mask) Or _
(myLong And (2 ^ bit1)) / aux Or _
(myLong And (2 ^ bit2)) * aux
End Function
Si alguien se sabe mas y quiere aportarlas están en el lugar indicado.
Temibles Lunas!¡.
BlackZeroX:
Código
Public Function LongToByte(ByVal lVal As Long) As Byte()
Dim bRet(0 To 3) As Byte
bRet(3) = (lVal And &HFF000000) \ &H1000000
bRet(2) = (lVal And &HFF0000) \ &H10000
bRet(1) = (lVal And &HFF00&) \ &H100
bRet(0) = (lVal And &HFF)
LongToByte = bRet
End Function
Código
Private sub ColorLongToRGB(ByVal LngColor As Long, ByRef OutRed As Byte, ByRef OutGreen As Byte, ByRef OutBlue As Byte)
OutBlue = (LngColor And &HFF0000) \ &H10000
OutGreen = (LngColor And &HFF00&) \ &H100
OutRed = (LngColor And &HFF)
End sub
Dulces Lunas!¡.
BlackZeroX:
Cambio rapido del signo a un valor dado N ( habitualmente: lval=(lval*(-1)) )
Código
Private Sub lChangeSign(ByRef lVal As Long)
' // Para cualquier valor que lVal pueda tomar.
' // Cambia de signo a un numero( + a - y de - a +).
lVal = ((Not lVal) + 1)
End Sub
' // Para valores tipo Integer
Private Sub iChangeSign(ByRef iVal As Integer)
' // Para cualquier valor que iVal pueda tomar.
' // Cambia de signo a un numero( + a - y de - a +).
lVal = ((Not lVal) + 1)
End Sub
Dulce sLunas!¡.
raul338:
Le puse chincheta :P
No seria lo mismo (despreciando la velocidad) si en lugar de tener 2 firmas, una para long y otra para integer. Usar & en su lugar? (Mr Frog habria usado eso alguna vez)
Ej
Sub xxx(ByRef val1&, ByRef val2&)
BlackZeroX:
& = as long, es lo mismo...
http://wiki.elhacker.net/programacion/vb/4---principios-basicos
Spyke1 - (Alias Mr. Frogs) me copio eso; pero ya entendí que mejor declaro bien y uso la técnica de declaración Hugara (o alguna nomenclatura simple pero concreta) en lugar de los signos al final de una variable, con excepciones por ejemplo en las funciones LongToByte y ColorLongToRGB la Mascara que se efectúa con &HFF00& para obtener los Bits deseados, tendría que ser una mascara tipo Long por ello se le pone el signo & ya que si no se le pone pasa a tratarse como un valor integer, solo para casos como estos se usa dicho signo.
Código
msgbox typename(&HFF00&)
msgbox typename(&HFF00)
Dulces Lunas!¡.
Navegación
[#] Página Siguiente