Page 1 of 1

Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 11:08 am
by VictorCasajuana
Hola.

Estoy enfrascado en un tema que no le veo la punta y seguro será simplón pero no he trabajado nunca de esta forma.

Tengo un control que activa opciones mediante un número, por ejemplo:
Opción 1 : valor 1
Opción 2 : valor 2
Opción 3 : valor 4
Opción 4 : valor 8

y así sucesivamente.

El control me devuelve un número según las opciones que se hayan activado, por ejemplo si se activa la opción 2 y opción 4, me devuelve 2 + 8 = 10

Con el dato 10 tengo que extraer el 2 y el 8

He probado la función IsBit() pero no acaba de cuadrarme bien.

Al tener un desconocimiento total de este tipo de funciones y antes de reinventar la rueda haciendo una función para ello, pregunto por si alguien me puede dar una pista de si FWH ya lleva algo que procese este tipo de datos.

Gracias de antemano y salud!

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 11:58 am
by Antonio Linares
Victor,

Puedes usar las propias funciones de Harbour:

? hb_bitAnd( 10, 2 )
? hb_bitAnd( 10, 8 )

Si escribes 10 en binario obtemos esto (puedes usar la calculadora de Windows en modo programador): "1010"

hb_bitAnd( 10, 2 ) intenta hacer un "and" del bit segundo entre "1010" y "10" (dos en binario). Efectivamente ambos tienen el bit "segundo" encendido y devuelve 2 (que es el valor "10")

hb_bitAnd( 10, 8 ) intenta hacer un "and" del bit cuarto entre "1010" y "1000" (ocho en binario). Efectivamente ambos tienen el bit "cuarto" encendido y devuelve 8 (que es el valor "1000")

También tienes la funcion hb_bitOr() que te permite hacer operaciones "or" en vez de operaciones "and".

Por ejemplo ? hb_bitOr( 10, 5 ) devuelve 15 (que es el valor binario "1111") que seria la "unión" de "1010" y "0101" (5)

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 12:02 pm
by Antonio Linares
Si prefieres usar las funciones de FWH lo harías asi:
Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   MsgInfo( IsBit( 10, 2 ) ) // está encendido el segundo bit del valor 10 ?
   MsgInfo( IsBit( 10, 4 ) ) // está encendido el cuarto bit del valor 10 ?

return nil

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 12:41 pm
by Carles
V,

Creo q esta ebtrada del amic Biel te servira...

https://bielsys.blogspot.com/2015/01/ma ... rbour.html

Salut.
C.

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 1:20 pm
by nageswaragunupudi
Code: Select all  Expand view
function ValSplit( nTotal )

   local aResult  := {}
   local n        := 1

   DEFAULT nTotal := 10

   do while n <= nTotal
      if lAnd( nTotal, n )
         AAdd( aResult, n )
      endif
      n  += n
   enddo

return aResult


Usage:
Code: Select all  Expand view
? ValSplit( 10 ) // -> { 2,8 }
? ValSplit( 12 ) // --> { 4,8 }

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 2:07 pm
by Carles
Rao,

very elegant, as usual... :D

C.

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 4:20 pm
by VictorCasajuana
wow! :shock:
me siento abrumado por la rápida respuesta de 3 masters!!!! :lol:

Antonio Linares wrote:Victor,

Puedes usar las propias funciones de Harbour:

? hb_bitAnd( 10, 2 )
? hb_bitAnd( 10, 8 )

Si escribes 10 en binario obtemos esto (puedes usar la calculadora de Windows en modo programador): "1010"

hb_bitAnd( 10, 2 ) intenta hacer un "and" del bit segundo entre "1010" y "10" (dos en binario). Efectivamente ambos tienen el bit "segundo" encendido y devuelve 2 (que es el valor "10")

hb_bitAnd( 10, 8 ) intenta hacer un "and" del bit cuarto entre "1010" y "1000" (ocho en binario). Efectivamente ambos tienen el bit "cuarto" encendido y devuelve 8 (que es el valor "1000")

También tienes la funcion hb_bitOr() que te permite hacer operaciones "or" en vez de operaciones "and".

Por ejemplo ? hb_bitOr( 10, 5 ) devuelve 15 (que es el valor binario "1111") que seria la "unión" de "1010" y "0101" (5)


Perfecto Antonio, entendido alto y claro, esto es lo que necesitaba!! :D

Carles wrote:V,

Creo q esta ebtrada del amic Biel te servira...

https://bielsys.blogspot.com/2015/01/ma ... rbour.html

Salut.
C.


de lujo, me ha ido bien pegarle un vistazo, además he repasado los artículos, siempre va bien leer un rato. :wink:

nageswaragunupudi wrote:
Code: Select all  Expand view
function ValSplit( nTotal )

   local aResult  := {}
   local n        := 1

   DEFAULT nTotal := 10

   do while n <= nTotal
      if lAnd( nTotal, n )
         AAdd( aResult, n )
      endif
      n  += n
   enddo

return aResult


Usage:
Code: Select all  Expand view
? ValSplit( 10 ) // -> { 2,8 }
? ValSplit( 12 ) // --> { 4,8 }


Mr. Rao, as always giving explicit examples and saving work. Fantastic.

Re: Función para extraer cadena numérica

PostPosted: Tue Aug 30, 2022 4:27 pm
by cmsoft
Un placer leer estas respuestas.... Seguimos aprendiendo...

Re: Función para extraer cadena numérica

PostPosted: Tue Sep 06, 2022 6:37 pm
by sysctrl2
Yo con los GURUS ni me meto
apenas si me sale bien la tabla del 10 :) :D
y con errores :shock: