Page 1 of 1
Función para extraer cadena numérica
Posted: 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
Posted: 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
Posted: 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
#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
Posted: 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
Posted: Tue Aug 30, 2022 1:20 pm
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 }
Re: Función para extraer cadena numérica
Posted: Tue Aug 30, 2022 2:07 pm
by Carles
Rao,
very elegant, as usual...
C.
Re: Función para extraer cadena numérica
Posted: Tue Aug 30, 2022 4:20 pm
by VictorCasajuana
wow!
me siento abrumado por la rápida respuesta de 3 masters!!!!
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!!

de lujo, me ha ido bien pegarle un vistazo, además he repasado los artículos, siempre va bien leer un rato.
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.
Re: Función para extraer cadena numérica
Posted: Tue Aug 30, 2022 4:27 pm
by cmsoft
Un placer leer estas respuestas.... Seguimos aprendiendo...
Re: Función para extraer cadena numérica
Posted: 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
y con errores
