OPERADORES AVANZADOS

OPERADORES ORIENTADOS AL BIT

Actúan sobre bits y sólo tienen validez en tipos char, int, long int del C. No pueden por tanto aplicarse a los tipos float, double, long double, void o u otros tipos complejos.

El operador & (AND)

Su tabla de verdad se da a continuación:

 

OperadorAND

p

q

p & q

0

0

0

0

1

0

1

0

0

1

1

1

 

  • #include <stdio.h>
    void main()
  • {

  • int p,q;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    q=025; /* octal: 025 -> binario: 0 000 000 000 010 101 */
    printf("\n %03o(oct) & %03o(oct) = %03o(oct)",p,q,p&q);
    printf("\n %03d(dec) & %03d(dec) = %03d(dec)",p,q,p&q);

    /* visualiza:

    047(oct) & 025(oct) = 005(oct)
    039(dec) & 021(dec) = 005(dec)
    */
  • }
 

El operador| (OR)

Su tabla de verdad se da a continuación:

operador OR

p

p

p | q

0

0

0

0

1

1

1

0

1

1

1

1

 

  • #include <stdio.h>
    void main()
  • {

  • int p,q;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    q=025; /* octal: 025 -> binario: 0 000 000 000 010 101 */
    printf("\n %03o(oct) | %03o(oct) = %03o(oct)",p,q,p | q);
    printf("\n %03d(dec) | %03d(dec) = %03d(dec)",p,q,p | q);

    /* visualiza:

    047(oct) | 025(oct) = 067(oct)
    039(dec) | 021(dec) = 055(dec)
    */
  • }
 

El operador ^ (XOR)

Su tabla de verdad se da a continuación:

operador OR

p

p

p ^ q

0

0

0

0

1

1

1

0

1

1

1

0

 

  • #include <stdio.h>
    void main()
  • {

  • int p,q;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    q=025; /* octal: 025 -> binario: 0 000 000 000 010 101 */
    printf("\n %03o(oct) ^ %03o(oct) = %03o(oct)",p,q,p ^ q);
    printf("\n %03d(dec) ^ %03d(dec) = %03d(dec)",p,q,p ^ q);

    /* visualiza:

    047(oct) ^ 025(oct) = 022(oct)
    039(dec) ^ 021(dec) = 018(dec)
    */
  • }
 

El operador ~ (NOT)

Su tabla de verdad se da a continuación:

operador NOT

p

~p

0

1

1

0

 

  • #include <stdio.h>
    void main()
  • {

  • int p;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    printf("\n ~%06o(oct) = %06o(oct)",p,~p);
    printf("\n ~%06d(dec) = %06d(d)",p,~p);

    /* visualiza:

    ~000047(oct) = 177730(oct)
    ~000039(dec) = -00033(dec)
    */
  • }
 

 

El operador >> (corrimiento a la derecha)

Traslada todos los bits tantos lugares a la derecha como indique el segundo operando.

 

  • #include <stdio.h>
    void main()
  • {

  • int p;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    printf("\n %03o(oct)>>1 = %03o(oct)",p,p>>1);
    printf("\n ~%03d(dec)>>1 = %03d(d)",p,p>>1);

    /* visualiza:

    047(oct)>>1 = 023(oct)
    039(dec)>>1 = 19(dec)
    */
  • }
 

El operador << (corrimiento a la izquierda)

Traslada todos los bits tantos lugares a la izquierda como indique el segundo operando.

 

  • #include <stdio.h>
    void main()
  • {

  • int p;
    p=047; /* octal: 047 -> binario: 0 000 000 000 100 111 */
    printf("\n %03o(oct)<<1 = %03o(oct)",p,p<<1);
    printf("\n ~%03d(dec)<<1 = %03d(d)",p,p<<1);

    /* visualiza:

    047(oct)<<1 = 116(oct)
    039(dec)<<1 = 78(dec)
    */
  • }
 

EL OPERADOR ?

El operador ? permite sustituir la instrucción if/else cuya sintaxis es:

Es indispensable que el contenido de if y de else sea un instrucción única.

x=expresion ? expresion1:expresion2

Nótese la posición de los dos puntos. Si expresion es distinta de cero (verdadera) el valor de expresion1 se le asigna a la variable x.Si expresion es igual a cero (falsa) el valor de expresion2 se le asigna a la variable x.

 

  • #include <stdio.h>
    void main()
  • {

  • int x=10, y=12; max;
    max = x>y ? x : y;
    printf("\n Il maximo de %d y %d de %d",x,y,max);
  • }
 

EL OPERADOR COMA

Permite concatenar varias expresiones. El operando de la izquierda es siempre evaluado como void. Esto significa que a la expresión de la derecha se le asigna el valor de la última expresión después de la coma. En la instrucción que sigue:

x=(y=3,y+1);

Se le asigna a y el valor 3 y a la x el valor 4 (y+1). Los paréntesis son necesarios por que el operador de asignación tiene prioridad sobre el de coma.

LOS PARENTESIS CUADRADOS Y REDONDOS

En C los paréntesis cuadrados y redondos son considerados operadores. Los paréntesis redondos aumentan el nivel de precedencia de las operaciones que delimitan. Los paréntesis cuadrados en cambio asignan índices a los vectores. Es interesante notar que no todos los lenguajes de programación tienen la particularidad de considerar los paréntesis como operadores.

COMBINACION DE OPERADORES CON EL OPERADOR DE ASIGNACION.

En tabla que sigue se dan dichos operadores junto con su equivalencia.

 

Operador

Ejemplo

Equivalencia

+=

x+=n;

x=x+n;

-=

x-=n;

x=x-n;

*=

x*=n;

x=x*n;

/=

x/=n;

x=x/n;

%=

x%=n

x=x%n;

&=

x&=n;

x=x&n;

|=

x|=n;

x=x|n;

^=

x^=n;

x=x^n;

<<=

x<<=n;

x=x<<n;

>>=

x>>=n;

x=x>>n;

 

JERARQUIA DE LOS OPERADORES

 

 

Prioridad

operador

Mayor

() [] -> .

 

! ~ ++ -- - (tipo) * sizeof

 

* / %

 

+ -

 

<< >>

 

<<= >>=

 

== !=

 

&

 

^

 

|

 

&&

 

||

 

?

 

= += -= *= /=

Menor

,