https://foro.gambas-es.org/viewtopic.php?f=19&t=5311
-----------------------------------
jsbsan
Miercoles, 30 Marzo 2016, 14:39

Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
¿Quien podría traducirme estas dos funciones hechas en javascript a Gambas3?
[code linenumbers=false]
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;
	};[/code]


-----------------------------------
vicr
Miercoles, 30 Marzo 2016, 15:41

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/

[url=http://aggregate.org/MAGIC/]El enlace

Allí entre tanta función aparece esto:

[quote]
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);
}
[/quote]

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/22081738/how-variable-precision-swar-algorithm-works

Espero te sirva.

Saludos.


-----------------------------------
vuott
Miercoles, 30 Marzo 2016, 16:03

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
Como bien sabes, Gambas tiene una función para actuar el desplazamiento de los bits a derecha: [i]Shr()[/i].  Pero prefiero usar una expresión explícita.

...de todas formas, teniendo tambien en cuenta lo que notó [i]vicr[/i], yo [i]traduciría[/i] de javascript como sigue:    :neutral: 
[code linenumbers=false syntax=gambas]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[/code][img]http://www.dragovoljac.com/forum/Smileys/default/sttrah.gif[/img]


-----------------------------------
jsbsan
Miercoles, 30 Marzo 2016, 21:47

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
Gracias Voutt y Vicr  :!:  :!:   :mryellow: 

Os dejo un ejemplo que he hecho con las funciones:

[code linenumbers=false syntax=gambas]' 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
[/code]


-----------------------------------
vuott
Jueves, 31 Marzo 2016, 00:16

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
jsbsan, porque no usas el tipo [i]Boolean[/i] ?
[code linenumbers=false syntax=gambas]Private Function b2IsPowerOfTwo(x As Integer) As Boolean
  
  If (x > 0) And ((x And (x - 1)) = 0) Then Return True
  
End[/code]


-----------------------------------
jsbsan
Jueves, 31 Marzo 2016, 08:25

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
Vuott:

[quote]porque no usas el tipo Boolean ?[/quote]
Me he equivocado, deberia haber puesto boolean.

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

Saludos


-----------------------------------
Shell
Jueves, 31 Marzo 2016, 08:51

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
Julio:

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

Saludos


-----------------------------------
jsbsan
Jueves, 31 Marzo 2016, 10:55

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
Shell:
[quote]¿ Y ese interés repentino por los bits ?[/quote]
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


-----------------------------------
vuott
Jueves, 31 Marzo 2016, 14:36

Re: Funciones De Desplazamiento De Bits....
-----------------------------------
[quote user="jsbsan" post="31391"]Estoy intentando empezar a traducir librerias de javascript...[/quote]
Shell,
yo y jsbsan hemos fundado la  [i][color=#A50000][/color][b]Schola traductionum[/b][/i] de otros lenguajes a Gambas.

[img]https://raccontiamoilmedioevo.wikispaces.com/file/view/scuola_8.jpg/325145040/scuola_8.jpg[/img]


-----------------------------------
Shell
Viernes, 01 Abril 2016, 10:06

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Julio:

Debe ser complicado solo con unos y ceros.  :o 

Vuott:

Así que traductores. Que bien, entonces tambien traducirás personalmente de Python a Gambas. :twisted: 
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


-----------------------------------
jsbsan
Viernes, 01 Abril 2016, 19:16

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Shell:

[quote]¿ Se puede demostrar de alguna forma que hacer un calculo en binario es más rápido que en decimal ?.[/quote]

He escrito un articulo para comentarlo como se hace en binario:

http://jsbsan.blogspot.com.es/2016/04/funcion-para-saber-si-un-numero-es.html

Un método "normal" en decimal, para hacer lo mismo (saber si un numero es una potencia de 2), seria un bucle vamos probando 2^2 , 2^3, .... hasta que se encuentre que 2^N=Numero dado, que indicaria que es potencia de 2, o si se supera nuetro numero, indicaria que no lo es:

[code linenumbers=false syntax=gambas]input numero
For n=1 to 100000000 'repetir hasta el infito
if 2^N=numero then return true
if 2^N>numero then return false
next
[/code]


-----------------------------------
shordi
Viernes, 01 Abril 2016, 19:19

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
[quote]Un método "normal" en decimal, para hacer lo mismo (saber si un numero es una potencia de 2), seria un bucle vamos probando 2^2 , 2^3, .... hasta que se encuentre que 2^N=Numero dado, que indicaria que es potencia de 2[/quote]
Yo soy de letras pero... ¿no basta con averiguar si es par?  :mryellow:  :mryellow:


-----------------------------------
jsbsan
Viernes, 01 Abril 2016, 20:46

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Shordi:

[code linenumbers=false syntax=gambas]¿no basta con averiguar si es par?[/code]
No, par y potencia de dos no son iguales...
6 es par, pero no es potencia de 2
8 es par, y potencia de 2
10 es par, pero no es potencia de 2
12 es par, pero no es potencia de 2
.....
.....

Lo que si puede ser es que siendo potencia de dos, implica que tenga que ser par.  :shock: ( pero lo contrario no se cumple)

[quote]
Yo soy de letras[/quote]
 [img]http://foro.gambas-es.org/files/images/6/hombre_de_letras.jpg[/img]


-----------------------------------
shordi
Viernes, 01 Abril 2016, 21:24

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Sí señor, Fan del gran Dylan también soy  :mrorange:  :mrorange:  :mrorange:


-----------------------------------
Shell
Sabado, 02 Abril 2016, 09:46

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Y..¿ no es más fácil hacer ?:

[code linenumbers=false syntax=gambas]
Public Function espotenciadedos(num As Integer) As Boolean
  
  Return (num > 0 And num Mod 2 = 0)
  
End
[/code]

Mmmm.... :???: 

Saludos


-----------------------------------
jsbsan
Sabado, 02 Abril 2016, 11:31

Re: Funciones Sobre Potencia De 2: Bits Y  And
-----------------------------------
Shell:

Que no... que un numero que es par no tiene que se potencia de dos:

[quote]No, par y potencia de dos no son iguales...
6 es par, pero no es potencia de 2
8 es par, y potencia de 2
10 es par, pero no es potencia de 2
12 es par, pero no es potencia de 2[/quote]


