Publi

  • Ejemplo para analizar y procesar expresiones matemáticas (y más) en PHP (Parsear en PHP)

    Parsear expresiones en PHP

    Una de las mayores armas de doble filo en cuanto a los lenguajes de programación interpretados es la función o expresión eval. Esta orden nos suele permitir escribir una cadena de caracteres con un texto en el mismo lenguaje que estamos escribiendo y ejecutarla. Es decir, si nos encontramos en Python y escribimos:

    1
    eval("100+23")

    Devolverá 123. O si estamos en PHP y hacemos:

    1
    2
    <?php
    eval("echo 100+23;");

    En la cadena de caracteres que introducimos podemos utilizar variables, bucles, condiciones… vamos, todo lo que nos permite el lenguaje de programación.… Leer artículo completo

  • Lanzando servidores TCP/IP en puertos libres aleatorios haciendo bind al puerto 0

    Servidores TCP en el puerto 0
    ¿Cómo? ¡Que los puertos TCP empiezan en el 1! Aunque algo sospechaba, porque en informática, el cero siempre ha valido para algo. Por eso se dice que los humanos empiezan a contar desde el uno y los informáticos desde el cero. Con esta cara me quedé cuando vi que puedes lanzar un servidor y que éste escuche en el puerto 0. Pero si el 0 no es un puerto válido, ¿para qué vale?… 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