Función para extraer cadena numérica

Post Reply
User avatar
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

Función para extraer cadena numérica

Post 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!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Función para extraer cadena numérica

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Función para extraer cadena numérica

Post by Antonio Linares »

Si prefieres usar las funciones de FWH lo harías asi:

Code: Select all | Expand

#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
Carles
Posts: 1149
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Been thanked: 7 times
Contact:

Re: Función para extraer cadena numérica

Post by Carles »

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
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Función para extraer cadena numérica

Post by nageswaragunupudi »

Code: Select all | Expand

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

? ValSplit( 10 ) // -> { 2,8 }
? ValSplit( 12 ) // --> { 4,8 }
Regards

G. N. Rao.
Hyderabad, India
User avatar
Carles
Posts: 1149
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Been thanked: 7 times
Contact:

Re: Función para extraer cadena numérica

Post by Carles »

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
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

Re: Función para extraer cadena numérica

Post 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

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

? 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
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Función para extraer cadena numérica

Post by cmsoft »

Un placer leer estas respuestas.... Seguimos aprendiendo...
User avatar
sysctrl2
Posts: 1048
Joined: Mon Feb 05, 2007 7:15 pm
Has thanked: 6 times
Contact:

Re: Función para extraer cadena numérica

Post by sysctrl2 »

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 "
Post Reply