Publi

  • Flags en un enum en C


    Las flags, son opciones binarias que acompañan un dato o un sistema y valen para informar o definir su comportamiento o su estado entre otras cosas.

    En muchos casos, utilizaremos flags para ver el resultado de una operación, imaginémonos que estamos pasando una serie de tests a un dato de texto:

    1. El dato no está vacío
    2. El dato tiene más de 3 letras
    3. El dato tiene menos de 20 letras
    4. El dato tiene caracteres no numéricos
    5. El dato tiene caracteres no números/letras
    6. El dato tiene caracteres de control
    7. El dato tiene caracteres no válidos
    8. El dato tiene formato de fecha
    9. El dato tiene formato de hora
    10. El dato tiene formato de teléfono
    11. El dato tiene formato de coordenadas

    Bueno, así puedo poner muchas condiciones, lo importante es la forma de almacenarlo.… Leer artículo completo

  • Magia en Bash 50 ejemplos en una sola linea (o dos)

    Bash es una de las herramientas más potentes que tenemos a nuestro alcance, aunque no sólo de bash trata el artículo, sino de trucos para consola, one-liner como dirían muchos (aunque habrá algunos two-liners) que podemos utilizar y pueden hacernos la vida un poco más fácil:

    Cadenas de texto

    Trim

    Es una herramienta que utilizaremos para recortar nuestra cadena basándonos en los a la ìzquierda y a la derecha, en este caso nos basaremos en los espacios, que es uno de sus usos más comunes (así podemos obtener la cadena limpia tanto por delante como por detrás.… Leer artículo completo

  • Recopilación de soluciones para los retos de #tuentiContest . Challenge #14

    Últimamente he hablado acerca del I concurso de programación de Tuenti. Un concurso de programación Online que se llevó acabo durante la semana pasada (del 13 al 20 de Junio, muy mala fecha).

    Podéis ver los enunciados de todos los problemas, con ejemplos sobre la entrada y salida (aunque a veces no hay que haerles mucho caso) en la web oficial del concurso, pero en Vidas Concurrentes lo encontramos todo en español.… Leer artículo completo

  • Números grandes en C usando GMP. Resolución del primer reto de #tuentiContest (Super Hard Sum)

    Aquí llega mi primera aportación a las soluciones de los retos del I concurso de programación de Tuenti. La utilización de números grandes es algo que siempre me llamó la atención, y normalmente utilizo bc cuando necesito algún cálculo. Este reto se podía resolver con bash/sed/bc y, aunque varios lenguajes permiten la utilización de números de precisión arbitraria «de serie»  como python y Java, yo decidí hacerlo en C, utilizando la biblioteca GMP.… Leer artículo completo

  • Bailando con bits: Trabajando a nivel de bit II

    binarios

    Hace unos días empecé con la serie Bailando con Bits (aunque llevaba escrito varios meses) trata de formas para trabajar a nivel de bit desde C.

    Hoy voy a proponer otra forma, quizás menos intuitiva que la anterior, pero diferente. Esta vez no utilizaremos un registro enorme ni nada parecido, utilizaremos un mismo número entero para hacer el ejemplo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>

    #define PESOBIT(bpos) 1<<bpos
    #define COGEBIT(var,bpos) (var & PESOBIT(bpos))?1:0
    #define PONE_1(var,bpos) var | PESOBIT(bpos)
    #define PONE_0(var,bpos) var & ~(PESOBIT(bpos))
    #define CAMBIA(var,bpos) var ^ PESOBIT(bpos)

    int main()
    {
      int numero;
      int i;

      numero=63;
      printf ("Numero: %d\n", numero);


      for (i=31; i>=0; i--)
        printf("%4d", i);

      printf("\n");

      for (i=31; i>=0; i--)
        printf("%4d",COGEBIT(numero,i));

      printf("\n");

      numero=PONE_1(numero, 17);
      numero=PONE_0(numero, 3);
      numero=CAMBIA(numero, 20);
      numero=CAMBIA(numero, 5);

      for (i=31; i>=0; i--)
        printf("%4d",COGEBIT(numero,i));

      printf("\nNúmero: %d\n", numero);

    }

    Ahora usamos varias macros que harán operaciones de bit con la variable a analizar (están definidas en la parte de arriba), tenemos PESOBIT, COGEBIT, PONE_1, PONE_0 y CAMBIA:

    • PESOBIT: Nos dice cuánto vale un bit con valor 1 en la posición especificada, por ejemplo en la posición 0 (LSB) vale 1, en la posición 1, vale 2, en la posición 3, vale 4, en la posición 4, vale 8…
    • COGEBIT: Nos dice si el bit en la posición bpos de la variable var vale 0 ó 1
    • PONE_1: Pone un 1 en el bit bpos de la variable var
    • PONE_0: Pone un 0 en el bit bpos de la variable var
    • CAMBIA: Cambia el valor (de 0 a 1 y viceversa) del bit en la posición bpos de la variable var

    Como vemos en el ejemplo si queremos poner a 1 el bit 5 de numero, tendremos que hacer numero=PONE_1(numero,5), aunque en el siguiente ejemplo veremos cómo simplificar todo eso.… Leer artículo completo