Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Funciones Sobre Potencia De 2: Bits Y And
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Funciones Sobre Potencia De 2: Bits Y And 
 
¿Quien podría traducirme estas dos funciones hechas en javascript a Gambas3?
b2Math.b2NextPowerOfTwo = function(x)
    {
        x |= (x >> 1) & 0x7FFFFFFF;
        x |= (x >> 2) & 0x3FFFFFFF;
        x |= (x >> 4) & 0x0FFFFFFF;
        x |= (x >> 8) & 0x00FFFFFF;
        x |= (x >> 16)& 0x0000FFFF;
        return x + 1;
    };
b2Math.b2IsPowerOfTwo = function(x)
    {
        var result = x > 0 && (x & (x - 1)) == 0;
        return result;
    };

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Viernes, 01 Abril 2016, 09:05; editado 2 veces 
Editado por jsbsan, Viernes, 01 Abril 2016, 09:05: Edito el titulo, para dejarlo más claro.
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Hola, Jsban...

Yo por lo poco que he visto de Javascript hice una búsqueda de la función para ver en los otros lenguajes a los que ha sido portado B2box y si eso resultaba más esclarecedor... y me encontré con éste sitio:

http://aggregate.org/MAGIC/

El enlace

Allí entre tanta función aparece esto:

Citar:

Next Largest Power of 2

Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next largest power of 2. For a 32-bit value:

unsigned int
nlpo2(register unsigned int x)
{
        x |= (x >> 1);
        x |= (x >> 2);
        x |= (x >> 4);
        x |= (x >> 8);
        x |= (x >> 16);
        return(x+1);
}


Por lo que se puede entender que: Se trata de una función recursiva (y que utilizaria los pipe (" | ") para ello ) conocida como "Algoritmo de Precision SWAR" (o algo por el estilo)... lo que me llevó a esta pagina:

http://stackoverflow.com/questions/...algorithm-works

Espero te sirva.

Saludos.
 



 
vicr - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Como bien sabes, gambas tiene una función para actuar el desplazamiento de los bits a derecha: Shr().  Pero prefiero usar una expresión explícita.

...de todas formas, teniendo tambien en cuenta lo que notó vicr, yo traduciría de javascript como sigue:    
Private Function function_1(x As Integer) As Integer

   x = x Or (x \ CInt(2 ^ 1)) And &7FFFFFFF&
   x = x Or (x \ CInt(2 ^ 2)) And &3FFFFFFF&
   etc...
   etc....

  Return x + 1

End


Private Function function_2(x As Integer) As Integer

  Dim result As Integer
  
   If (x > 0) And ((x And (x - 1)) = 0) Then result = 1
    
   Return result

End
sttrah
 



 
última edición por vuott el Jueves, 31 Marzo 2016, 03:09; editado 6 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Gracias Voutt y Vicr      

Os dejo un ejemplo que he hecho con las funciones:

' gambas module file

Public Sub Main()
  
  Dim n As Integer
  
  For n = 2 To 100
    Print "n:", n
    Print "siguente potencia de 2:", b2NextPowerOfTwo(n)
    'Print b2NextPowerOfTwo(n)
    Print "<-->"
    Print "¿es potencia de 2?:", b2IsPowerOfTwo(n)
    'Print b2IsPowerOfTwo(n)
    Print "---------------------------------------"
  Next
  
End

Private Function b2NextPowerOfTwo(x As Integer) As Integer
  
  x = x Or (x \ CInt(2 ^ 1)) And &7FFFFFFF&
  x = x Or (x \ CInt(2 ^ 2)) And &3FFFFFFF&
  x = x Or (x \ CInt(2 ^ 4)) And &0FFFFFFF&
  x = x Or (x \ CInt(2 ^ 8)) And &00FFFFFF&
  x = x Or (x \ CInt(2 ^ 16)) And &0000FFFF&
  Return x + 1
  
End

Private Function b2IsPowerOfTwo(x As Integer) As Integer
  
  If (x > 0) And ((x And (x - 1)) = 0) Then Return True
  Return False
  
End
 

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
jsbsan, porque no usas el tipo Boolean ?
Private Function b2IsPowerOfTwo(x As Integer) As Boolean
  
  If (x > 0) And ((x And (x - 1)) = 0) Then Return True
  
End

 



 
última edición por vuott el Jueves, 31 Marzo 2016, 01:17; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Vuott:

Citar:
porque no usas el tipo Boolean ?

Me he equivocado, deberia haber puesto boolean.

Lo que no sabia, es que si una funcion no devuelve nada, devuelve 0 (false)

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Julio:

¿ Y ese interés repentino por los bits ?.  
¿ Quieres desplazarlos ?. ¿ Tienes bits ocupas ?.

Saludos
 




===================
Gambas Básico
“Si no puedes explicar algo de forma sencilla, entonces es que tú no lo entiendes bien.” Albert Einstein
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
Shell:
Citar:
¿ Y ese interés repentino por los bits ?

Estoy intentando empezar a traducir librerias de javascript, del tema del motor de fisica Bos2d, y me encontrado con varias funciones "raras" que no se muy bien para que se usan.

El caso es, que como en el sistema binario (0,1), es más fácil trabajar con  potencias de 2 que con el sistema decimal, (y mucho más rápido para la máquina), aprovechamos "ese pequeño truco" para hacerlas en ese sistema. Creo que por eso se usan las funciones de desplazamiento: operaciones que en sistemas decimal consumen muchos ciclos de cálculo, en binario simplemente se trata de desplazar 0 y 1.

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones De Desplazamiento De Bits.... 
 
jsbsan escribió: [Ver mensaje]
Estoy intentando empezar a traducir librerias de javascript...

Shell,
yo y jsbsan hemos fundado la  Schola traductionum de otros lenguajes a Gambas.

scuola_8
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Sobre Potencia De 2: Bits Y And 
 
Julio:

Debe ser complicado solo con unos y ceros.  

Vuott:

Así que traductores. Que bien, entonces tambien traducirás personalmente de Python a gambas.
Claro que siempre habrá cosas que no se pueden traducir tan fácilmente. Debido a su complejidad o
lo que solicite.

¿ Se puede demostrar  de alguna forma que hacer un calculo en binario es más rápido que en decimal ?.
¿ Nos valdría el perfilado ?. Se necesitaría hacer un buen número de operaciones.

Saludos
 




===================
Gambas Básico
“Si no puedes explicar algo de forma sencilla, entonces es que tú no lo entiendes bien.” Albert Einstein
 
última edición por Shell el Viernes, 01 Abril 2016, 11:11; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Pequeña Duda Sobre Funciones shordi General 2 Viernes, 09 Octobre 2009, 19:08 Ver último mensaje
shordi
No hay nuevos mensajes Averiguar Si Un Número Es Una Potencia De 2 vuott Aplicaciones/Fragmentos de Código 2 Miercoles, 17 Agosto 2016, 00:41 Ver último mensaje
vuott
No hay nuevos mensajes Calcular La Potencia De Pico Y Amplitud De... vuott Aplicaciones/Fragmentos de Código 1 Sabado, 24 Septiembre 2016, 15:31 Ver último mensaje
Grandamakulo
No hay nuevos mensajes Rotar Y Girar Sobre Su Eje Una Imagen Con ... vuott Controles/Librerías/Componentes 10 Martes, 06 Junio 2017, 12:03 Ver último mensaje
vuott
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario