elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Comprobar si un numero es odioso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Comprobar si un numero es odioso  (Leído 11,255 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
[RETO] Comprobar si un numero es odioso
« en: 16 Agosto 2010, 02:01 am »

La verdad es que me hace gracia ver los nombres que les ponen a los tipos de numeros :laugh: :laugh: :laugh:

Un numero odioso es aquel que en su expresion binaria tiene una cantidad impar de unos... por ejemplo el numero ONCE (11) que expresado en forma binaria es 1011, es decir 3 unos..

Mas info:
Código:
http://mathworld.wolfram.com/OdiousNumber.html
http://oeis.org/classic/A000069

Se medira el tiempo que tarda en calcular 100.000 numeros... tal que asi:
Código:
    Dim i   As Long
   
    For i = 1 To 100000
        Call IsItOdious(i)
    Next i

Id preparando los codeees! :P


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #1 en: 16 Agosto 2010, 02:09 am »

Aqui teneis un ejemplo de algoritmo habitual:
Código
  1. Private Function IsItOdious(ByVal lNumb As Long) As Boolean
  2.    Dim lCount  As Long
  3.    Dim i       As Long
  4.  
  5.    If lNumb <= 0 Then Exit Function
  6.    For i = 0 To 30
  7.        If lNumb And 2 ^ i Then lCount = lCount + 1
  8.    Next i
  9.    IsItOdious = ((lNumb Mod 2) <> 0)
  10. End Function

Por supuesto se puede hacer mas rapido :D

Todo el mundo a pensar en 0s y 1s!! :laugh:


En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #2 en: 16 Agosto 2010, 06:46 am »

yo pongo esta pero me siento un ladron  >:(

Código
  1. Private Function IsOdiousNumber(lNum As Long) As Boolean
  2.  
  3.    Dim l As Long
  4.  
  5.    l = ((lNum And &H80000000) \ &H80000000)
  6.    l = l + ((lNum And &H40000000) \ &H40000000)
  7.    l = l + ((lNum And &H20000000) \ &H20000000)
  8.    l = l + ((lNum And &H10000000) \ &H10000000)
  9.    l = l + ((lNum And &H8000000) \ &H8000000)
  10.    l = l + ((lNum And &H4000000) \ &H4000000)
  11.    l = l + ((lNum And &H2000000) \ &H2000000)
  12.    l = l + ((lNum And &H1000000) \ &H1000000)
  13.    l = l + ((lNum And &H800000) \ &H800000)
  14.    l = l + ((lNum And &H400000) \ &H400000)
  15.    l = l + ((lNum And &H200000) \ &H200000)
  16.    l = l + ((lNum And &H100000) \ &H100000)
  17.    l = l + ((lNum And &H80000) \ &H80000)
  18.    l = l + ((lNum And &H40000) \ &H40000)
  19.    l = l + ((lNum And &H20000) \ &H20000)
  20.    l = l + ((lNum And &H10000) \ &H10000)
  21.    l = l + ((lNum And &H8000&) \ &H8000&)
  22.    l = l + ((lNum And &H4000) \ &H4000)
  23.    l = l + ((lNum And &H2000) \ &H2000)
  24.    l = l + ((lNum And &H1000) \ &H1000)
  25.    l = l + ((lNum And &H800) \ &H800)
  26.    l = l + ((lNum And &H400) \ &H400)
  27.    l = l + ((lNum And &H200) \ &H200)
  28.    l = l + ((lNum And &H100) \ &H100)
  29.    l = l + ((lNum And &H80) \ &H80)
  30.    l = l + ((lNum And &H40) \ &H40)
  31.    l = l + ((lNum And &H20) \ &H20)
  32.    l = l + ((lNum And &H10) \ &H10)
  33.    l = l + ((lNum And &H8) \ &H8)
  34.    l = l + ((lNum And &H4) \ &H4)
  35.    l = l + ((lNum And &H2) \ &H2)
  36.    l = l + ((lNum And &H1) \ &H1)
  37.  
  38.    IsOdiousNumber = l Mod 2 <> 0
  39. End Function
  40.  

En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #3 en: 16 Agosto 2010, 07:07 am »

Como Karcrack ya dijo ...

Código
  1.  
  2. IsOdiousNumber = (l mod 2) <> 0
  3.  
  4.  

= y mas rapido asi

Código
  1.  
  2. IsOdiousNumber = (l And 1) <> 0
  3.  
  4.  

Código
  1.  
  2. Private Function IsOdiousNumber(lNum As Long) As Boolean
  3.  
  4.    Dim l As Long
  5.  
  6.    l = ((lNum And &H80000000) \ &H80000000)
  7.    l = l + ((lNum And &H40000000) \ &H40000000)
  8.    l = l + ((lNum And &H20000000) \ &H20000000)
  9.    l = l + ((lNum And &H10000000) \ &H10000000)
  10.    l = l + ((lNum And &H8000000) \ &H8000000)
  11.    l = l + ((lNum And &H4000000) \ &H4000000)
  12.    l = l + ((lNum And &H2000000) \ &H2000000)
  13.    l = l + ((lNum And &H1000000) \ &H1000000)
  14.    l = l + ((lNum And &H800000) \ &H800000)
  15.    l = l + ((lNum And &H400000) \ &H400000)
  16.    l = l + ((lNum And &H200000) \ &H200000)
  17.    l = l + ((lNum And &H100000) \ &H100000)
  18.    l = l + ((lNum And &H80000) \ &H80000)
  19.    l = l + ((lNum And &H40000) \ &H40000)
  20.    l = l + ((lNum And &H20000) \ &H20000)
  21.    l = l + ((lNum And &H10000) \ &H10000)
  22.    l = l + ((lNum And &H8000&) \ &H8000&)
  23.    l = l + ((lNum And &H4000) \ &H4000)
  24.    l = l + ((lNum And &H2000) \ &H2000)
  25.    l = l + ((lNum And &H1000) \ &H1000)
  26.    l = l + ((lNum And &H800) \ &H800)
  27.    l = l + ((lNum And &H400) \ &H400)
  28.    l = l + ((lNum And &H200) \ &H200)
  29.    l = l + ((lNum And &H100) \ &H100)
  30.    l = l + ((lNum And &H80) \ &H80)
  31.    l = l + ((lNum And &H40) \ &H40)
  32.    l = l + ((lNum And &H20) \ &H20)
  33.    l = l + ((lNum And &H10) \ &H10)
  34.    l = l + ((lNum And &H8) \ &H8)
  35.    l = l + ((lNum And &H4) \ &H4)
  36.    l = l + ((lNum And &H2) \ &H2)
  37.    l = l + ((lNum And &H1) \ &H1)
  38.  
  39.    IsOdiousNumber = (l and 1) <> 0
  40.  
  41. End Function
  42.  
  43.  

Ducles Lunas!¡.
En línea

The Dark Shadow is my passion.
cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #4 en: 16 Agosto 2010, 09:05 am »

Código:
Private Function IsOdiousNumber(ByVal lVal As Long) As Boolean
    Do
        If lVal And 1 Then IsOdiousNumber = Not IsOdiousNumber
        lVal = lVal \ 2
        If lVal = 0 Then Exit Function
        If lVal = 1 Then IsOdiousNumber = Not IsOdiousNumber: Exit Function
    Loop
End Function
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #5 en: 16 Agosto 2010, 13:41 pm »

Mi codigo, lo comento para que quien no entienda de Bits le quede mas claro ;):
Código:
Private Function IsItOdious(ByVal lNumb As Long) As Boolean
    Dim bTmp    As Byte
    Dim bRes    As Byte
   
    ' Si es negativo...
    If lNumb And &H80000000 Then Exit Function
   
    'Obtenemos el HiByte
    bTmp = lNumb And &HFF
    bRes = (bTmp And 1)
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
   
    ' Rotamos el numero 32bits a la derecha
    lNumb = lNumb \ &H100
   
    'Obtenemos el HiByte
    bTmp = lNumb And &HFF
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
   
    ' Rotamos el numero 32bits a la derecha
    lNumb = lNumb \ &H100
   
    'Obtenemos el HiByte
    bTmp = lNumb And &HFF
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
   
    ' Rotamos el numero 32bits a la derecha
    lNumb = lNumb \ &H100
   
    'Obtenemos el HiByte
    bTmp = lNumb And &HFF
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
    If (bTmp And 1) Then bRes = bRes + 1
    bTmp = bTmp \ 2
   
    IsItOdious = (bRes And 1)
End Function


Despues de ver que la tecnica de Leandro era muy rapida he intentado modificar la de Cobein que parecia que tenia potencial:
Código:
Private Function IsOdiousNumberX(ByVal lVal As Long) As Boolean
    If lVal And &H80000000 Then Exit Function
   
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2

    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
   
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
   
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
    If lVal And 1 Then IsOdiousNumberX = Not IsOdiousNumberX
    lVal = lVal \ 2
End Function


Resultados:
Código:
Karcrack:
49,668 msec
Cobein:
14,426 msec
LeandroA:
8,991 msec
Cobein (Mod Karcrack):
12,547 msec
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #6 en: 16 Agosto 2010, 14:12 pm »

Nada mal por ahora, hice unas modificaciones al codigo que postie pero no vi ninguna diferencia realmente significativa. No creo que se pueda hacer mucho mas rapido que el de leandro aunque vi cosas que se podrian optimizar posiblemente pero no creo que haga mucha diferencia.

Con respecto al code que postie por si alguno le interesa, es lo mas simple que se me ocurrio. Simplemente verifica si el numero tiene un uno si lo tiene invierte el valor del flag y hace un shift right y vuelta a lo mismo hasta que llega al ultimo valor.
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #7 en: 16 Agosto 2010, 19:45 pm »

Hola a todos:

Disculpen que me haya entrometido nuevamente, pero bueno, para eso es el foro.
Les dejo aquí mi código, que es un poco largo, pero igual funciona (al menos para los números del 1 al 100).

Código:
Private Function esOdioso4(ByVal num As Long) As Long

    esOdioso4 = 0
    If (num And &H40000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H20000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H10000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H8000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H4000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H2000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H1000000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H800000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H400000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H200000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H100000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H80000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H40000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H20000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H10000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H8000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H4000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H2000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H1000) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H800) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H400) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H200) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H100) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H80) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H40) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H20) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H10) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H8) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H4) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H2) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
    If (num And &H1) <> 0 Then
        esOdioso4 = esOdioso4 Xor 1
    End If
End Function

Eso es todo. Saludos.
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #8 en: 16 Agosto 2010, 20:22 pm »

Simplemente para mostrar otra manera, no es mas veloz pero me parecio interesante mostrar la parte donde se reduce el numero a 1 byte.

Código:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)


Private Type Dummy_Byte
    b1 As Byte
    b2 As Byte
    b3 As Byte
    b4 As Byte
End Type

Private Function IsOdiousNumber(ByVal lVal As Long) As Boolean
    Dim b As Dummy_Byte

    CopyMemory b.b1, lVal, 4
    lVal = b.b1
    lVal = lVal Xor b.b2
    lVal = lVal Xor b.b3
    lVal = lVal Xor b.b4
   
    Dim l As Long

    l = l + ((lVal And &H80) \ &H80)
    l = l + ((lVal And &H40) \ &H40)
    l = l + ((lVal And &H20) \ &H20)
    l = l + ((lVal And &H10) \ &H10)
    l = l + ((lVal And &H8) \ &H8)
    l = l + ((lVal And &H4) \ &H4)
    l = l + ((lVal And &H2) \ &H2)
    l = l + ((lVal And &H1) \ &H1)
 
    IsOdiousNumber = (l And 1)
   
End Function
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: [RETO] Comprobar si un numero es odioso
« Respuesta #9 en: 17 Agosto 2010, 00:17 am »

Bueno, como no pude hacer un código más rápido que el de LeandroA, decidí modificar su código un poquitín. Según mis pruebas, así es más rápido.

Código:
Private Function IsOdiousNumberModif(lNum As Long) As Boolean
 
   Dim l As Long
 
   l = ((lNum And &H80000000) \ &H80000000)
   l = l Xor ((lNum And &H40000000) \ &H40000000)
   l = l Xor ((lNum And &H20000000) \ &H20000000)
   l = l Xor ((lNum And &H10000000) \ &H10000000)
   l = l Xor ((lNum And &H8000000) \ &H8000000)
   l = l Xor ((lNum And &H4000000) \ &H4000000)
   l = l Xor ((lNum And &H2000000) \ &H2000000)
   l = l Xor ((lNum And &H1000000) \ &H1000000)
   l = l Xor ((lNum And &H800000) \ &H800000)
   l = l Xor ((lNum And &H400000) \ &H400000)
   l = l Xor ((lNum And &H200000) \ &H200000)
   l = l Xor ((lNum And &H100000) \ &H100000)
   l = l Xor ((lNum And &H80000) \ &H80000)
   l = l Xor ((lNum And &H40000) \ &H40000)
   l = l Xor ((lNum And &H20000) \ &H20000)
   l = l Xor ((lNum And &H10000) \ &H10000)
   l = l Xor ((lNum And &H8000&) \ &H8000&)
   l = l Xor ((lNum And &H4000) \ &H4000)
   l = l Xor ((lNum And &H2000) \ &H2000)
   l = l Xor ((lNum And &H1000) \ &H1000)
   l = l Xor ((lNum And &H800) \ &H800)
   l = l Xor ((lNum And &H400) \ &H400)
   l = l Xor ((lNum And &H200) \ &H200)
   l = l Xor ((lNum And &H100) \ &H100)
   l = l Xor ((lNum And &H80) \ &H80)
   l = l Xor ((lNum And &H40) \ &H40)
   l = l Xor ((lNum And &H20) \ &H20)
   l = l Xor ((lNum And &H10) \ &H10)
   l = l Xor ((lNum And &H8) \ &H8)
   l = l Xor ((lNum And &H4) \ &H4)
   l = l Xor ((lNum And &H2) \ &H2)
   l = l Xor ((lNum And &H1) \ &H1)
 
   IsOdiousNumberModif = (l And 1) <> 0
End Function

Pruébenlo, me parece que sí es más rápido.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] Comprobar si un número es ondulado
Programación C/C++
Kropt32 2 7,282 Último mensaje 15 Diciembre 2010, 09:04 am
por Kropt32
[JSTL] Como comprobar si una variable es un numero en JSTL
Desarrollo Web
nhaalclkiemr 0 4,449 Último mensaje 10 Abril 2011, 20:42 pm
por nhaalclkiemr
[RETO] Determinar Número Perfecto « 1 2 3 »
Programación Visual Basic
Miseryk 20 8,266 Último mensaje 8 Noviembre 2013, 02:24 am
por rob1104
comprobar numero repetido en un vector
Programación C/C++
MessageBoxA 4 3,052 Último mensaje 26 Junio 2014, 02:05 am
por MeCraniDOS
numero odioso NUEVO!
Programación C/C++
marsicobetre 3 5,139 Último mensaje 23 Octubre 2015, 13:13 pm
por do-while
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines