Función para extraer cadena numérica

Función para extraer cadena numérica

Postby VictorCasajuana » Tue Aug 30, 2022 11:08 am

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!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: Función para extraer cadena numérica

Postby Antonio Linares » Tue Aug 30, 2022 11:58 am

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)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Función para extraer cadena numérica

Postby Antonio Linares » Tue Aug 30, 2022 12:02 pm

Si prefieres usar las funciones de FWH lo harías asi:
Code: Select all  Expand view  RUN
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Función para extraer cadena numérica

Postby Carles » Tue Aug 30, 2022 12:41 pm

V,

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

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

Salut.
C.
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
Skype -> https://join.skype.com/cnzQg3Kr1dnk
User avatar
Carles
 
Posts: 1137
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona

Re: Función para extraer cadena numérica

Postby nageswaragunupudi » Tue Aug 30, 2022 1:20 pm

Code: Select all  Expand view  RUN
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  RUN
? ValSplit( 10 ) // -> { 2,8 }
? ValSplit( 12 ) // --> { 4,8 }
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10646
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Función para extraer cadena numérica

Postby Carles » Tue Aug 30, 2022 2:07 pm

Rao,

very elegant, as usual... :D

C.
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
Skype -> https://join.skype.com/cnzQg3Kr1dnk
User avatar
Carles
 
Posts: 1137
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona

Re: Función para extraer cadena numérica

Postby VictorCasajuana » Tue Aug 30, 2022 4:20 pm

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  RUN
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  RUN
? ValSplit( 10 ) // -> { 2,8 }
? ValSplit( 12 ) // --> { 4,8 }


Mr. Rao, as always giving explicit examples and saving work. Fantastic.
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: Función para extraer cadena numérica

Postby cmsoft » Tue Aug 30, 2022 4:27 pm

Un placer leer estas respuestas.... Seguimos aprendiendo...
User avatar
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Función para extraer cadena numérica

Postby sysctrl2 » Tue Sep 06, 2022 6:37 pm

Yo con los GURUS ni me meto
apenas si me sale bien la tabla del 10 :) :D
y con errores :shock:
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1022
Joined: Mon Feb 05, 2007 7:15 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 90 guests