elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con operaciones a nivel de bits y mascaras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con operaciones a nivel de bits y mascaras  (Leído 3,149 veces)
redpeli20

Desconectado Desconectado

Mensajes: 2


Ver Perfil
ayuda con operaciones a nivel de bits y mascaras
« en: 30 Mayo 2015, 20:16 pm »

El Problema es el Siguiente: Debo realizar este programa en C

Recibo un número (entero sin signo) y según el carácter a su derecha, se debe sustituir todas las coincidencias de ese carácter en el número por el valor 0 (cero). Acá un ejemplo:

La entrada es "25798 6" entonces 25798 en hexadecimal es 0x000064C6 y el carácter en la entrada es 6. Por medio de operadores y uso de mascaras, debo sobrescribir el número eliminando el 6 y escribiendo 0 (cero) en su lugar.

El número resultante es 1216 que es hexadecimal es 0x000004C0. Como resultado debo imprimir por pantalla 1216

Las operaciones que puedo usar son las siguientes:
!
~
^
&
|
+
<<
>>

No esta permitido el uso de arreglos.

Mod: No escribir en mayúsculas


« Última modificación: 30 Mayo 2015, 22:53 pm por engel lex » En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: AYUDA CON OPERACIONES A NIVEL DE BITS Y MASCARAS
« Respuesta #1 en: 30 Mayo 2015, 21:37 pm »

Bienvenido al foro

Primero tendrias que haces una mascara que contenga el último dígito así:

Código
  1. unsigned int mascara = num & 0xF;

EL 0xF e Binario sería: 0000 .... 1111, al aplicar un and lógico sobre el 0xF y el número como resultado se obtiene el último dígito del número en hexadecimal

Luego:

Código
  1. int i;
  2. int bitsnum;
  3.   for(i = 0; i < 8;i++){
  4.  
  5.       bitsnum = num & 0xF << i*4;
  6.       if( (mascara ^ (bitsnum ) ) == 0){
  7.           num = (num ^ mascara);
  8.       }
  9.  
  10.       mascara <<= 4; //para ir comprobando otras posiciones de 4 en 4
  11.   }    
  12.  



« Última modificación: 30 Mayo 2015, 23:11 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
redpeli20

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: AYUDA CON OPERACIONES A NIVEL DE BITS Y MASCARAS
« Respuesta #2 en: 30 Mayo 2015, 21:58 pm »

En tu codigo, tu variable num cual es??  0x86FC6 o 6?

Aca explico mejor, recibo un numero sin signo por ejemplo 25798 que en hexa seria 0x000064C6, y al lado recibo otro numero que es el que deseo sustituir en el hexa anteriro y cambiarlo por 0.

Es decir, si recibo 0x000064C6 6 la respuesta del programa debe ser donde esta el 6 cambiarlo por 0; 0x000004c0.

Si la entrada fuese 0x000064C6 4, donde este el 4 lo sustituyo por 0. 0x000060C6
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: AYUDA CON OPERACIONES A NIVEL DE BITS Y MASCARAS
« Respuesta #3 en: 30 Mayo 2015, 22:20 pm »

ya lo he solucionado pero no sé si explicarte todo o cómo lo mejor es que te pongas a estudiar y practicar, y vienes aquí cuando ya tengas algo y no estes empezando desde cero
« Última modificación: 30 Mayo 2015, 23:13 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: ayuda con operaciones a nivel de bits y mascaras
« Respuesta #4 en: 31 Mayo 2015, 17:29 pm »

Pues yo he intentado hacer una versión no iterativa (ni recursiva, claro), de éste algoritmo, con alguna cadena finita de operaciones binarias... y casi pierdo la cabeza.

Primero "duplicaba" la máscara (por ejemplo, 0x6) para que tuviera mismo ancho que el `unsigned` con el que me comparo (por ejemplo, 0x66666666), y luego realizaba el XOR con el número original.

Como el XOR lo que hace es filtrarte los bits diferentes, estuve intentando construir otra máscara con un AND (para obtener los bits "iguales"), y luego, con algún tipo de resta y AND entre ambas máscaras, conseguir que los bits que han superado ambos test, se "sumen" (que deben estar exclusivamente encerradas en las cuartetas que no sean 0x6), de modo que al aplicar ésta máscara final con el número original, solo se hagan a cero las cuartetas oportunas.

¡Pero no hay forma! Os reto a que lo intentéis (una versión no interativa de éste problema --excepto quizás para construir una máscara original). De verdad, me parece increíble que algo tan trivial sea tan escurridizo.

 
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: ayuda con operaciones a nivel de bits y mascaras
« Respuesta #5 en: 1 Junio 2015, 00:04 am »

El código que publiqué arriba resuelve el problema.

Un saludo
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: ayuda con operaciones a nivel de bits y mascaras
« Respuesta #6 en: 2 Junio 2015, 11:17 am »

Sí, lo sé. Pero estoy convencido de que debe haber una solución no iterativa al problema, y el no encontrarlo me está sacando de quicio, jeje. Cuando tenga más tiempo lo intentaré de nuevo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
operaciones con direcciones,hosts y mascaras
Redes
m@o_614 1 2,258 Último mensaje 23 Mayo 2013, 22:00 pm
por engel lex
Máscaras y bloques de bits
Programación C/C++
loryisus 6 2,858 Último mensaje 7 Marzo 2014, 20:16 pm
por eferion
Operadores a nivel de bits (lenguaje C). « 1 2 »
Programación C/C++
NOB2014 16 10,258 Último mensaje 21 Marzo 2014, 15:16 pm
por Yoel Alejandro
De minúscula a mayúscula a nivel de bits (lenguaje C.)
Programación C/C++
NOB2014 4 3,961 Último mensaje 21 Marzo 2014, 02:44 am
por rir3760
[Consulta] Operador OR para operaciones lógicas de bits en Lua 5.1.5
Scripting
BloodSharp 0 2,198 Último mensaje 25 Junio 2020, 18:17 pm
por BloodSharp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines