Recopilacion de Funciones con operaciones Binarias.

(1/3) > >>

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

[0] Índice de Mensajes

[#] Página Siguiente