By Wael

Last updated :

Posted :

iso646.h header in c , a tutorial

The iso646.h header in c was defined as part of the c99 standard. It defines alternative ways for using the equality, boolean, and bitwise operators. For example instead of using the bitwise && operator, the and token can be used. iso646.h operators replacements, do not work in string or character literals.

The iso646.h header defines replacement for the boolean bitwise and equality operators.
iso646.h operator Alternative token Equality Operators != not_eq Boolean Operators && and || or ! not Bitwise Operators & bitand &= and_eq | bitor |= or_eq ^ xor ^= xor_eq ^= xor_eq ~ compl operator replacement
#include <iso646.h>
/*
    include the iso646 header,
    in order to use the:
        equality
        boolean
        bitwise
    operators, alternative tokens .*/


#include <stdio.h>
/*
    include the stdio.h header in
    order to use printf, to print
    formatted strings .*/


#include <stdbool.h>
/*
    include stdbool.h header in
    order to use boolean true,
    and false.
        true  is defined as 1
        false is defined as 0 .*/


#include <stdint.h>
/*
    include the stdint header
    in order to use u_int8_t, which
    is an unsigned integer formed of
    8 bits. */


char* boolToString( bool aBool );
/*
    A function that converts a boolean
    to string. */


int main( int argc, char const * argv[ ] ){

    int anIntOne = 1;
    int anIntwo = 2;
    int anintThree = 1;


    /*	Equality operator alternative token
                != : not_eq .*/

    printf( "%d not_eq %d = %s\n",
            anIntOne,
            anIntwo,
            boolToString( anIntOne not_eq anIntwo ));
    /* output :
       1 not_eq 2 = true */

    printf( "%d not_eq %d = %s\n",
            anIntOne,
            anintThree,
            boolToString( anIntOne not_eq anintThree ));
    /* output :
        1 not_eq 1 = false .*/


    /*
        Boolean operators alternative tokens
                    && : and
                    || : or
                    !  : not */

    bool boolOne = true;
    bool boolTwo = false;
    // define two boolean values

    printf( "%s and %s is %s\n",
            boolToString( boolOne ),
            boolToString( boolTwo ),
            boolToString( boolOne and boolTwo ));
    /* output :
        true and false is false .*/

    printf( "%s or %s is %s\n",
            boolToString( boolOne ),
            boolToString( boolTwo ),
            boolToString( boolOne or boolTwo ));
    /* output :
        true or false is true .*/

    printf( "not boolOne = not %s = %s\n",
            boolToString( boolOne ),
            boolToString( not boolOne ));
    /* output :
        not boolOne = not true = false .*/


    /*
        Bitwise operators alternative tokens
        &  : bitand
        &= : and_eq
        |  : bitor
        |= : or_eq
        ^  : xor
        ^= : xor_eq
        ~  : compl .*/

    u_int8_t ui8_one = 3;
    // ui8_one  = 3 = 0000_0011
    u_int8_t ui8_two = 5;
    // ui8_two  = 5 = 0000_0101

    printf( "%d bitand %d = %d\n",
            ui8_one,
            ui8_two,
            (u_int8_t)( ui8_one bitand ui8_two ));
    /* output :
            3 bitand 5 = 1
        ui8_one : 0000_0011 : 3
        ui8_two : 0000_0101 : 5
                   ---------
                   0000_0001 : 1 .*/

    printf( "%d and_eq %d = %d\n",
            ui8_two,
            ui8_one,
            ( u_int8_t )( ui8_two and_eq ui8_one ));
    /* output :
            5 and_eq 3 = 1
        ui8_two : 0000_0101 : 5
        ui8_one : 0000_0011 : 3
                   ---------
        ui8_two   0000_0001 : 1 .*/

    printf( "%d bitor %d = %d\n",
            ui8_one,
            ui8_two,
            ( u_int8_t )( ui8_one bitor ui8_two ));
    /* output :
            3 bitor 1 = 1
        ui8_one : 0000_0011 : 3
        ui8_two : 0000_0001 : 1
                  ---------
                  0000_0011 : 3 .*/

    printf( "%d or_eq %d = %d\n",
            ui8_two,
            ui8_one,
            ( u_int8_t )( ui8_two or_eq ui8_one ));
    /* output :
            1 or_eq 3 = 3
        ui8_two : 0000_0001 : 1
        ui8_one : 0000_0011 : 3
                   ---------
        ui8_two   0000_0011 : 3 .*/

    printf( "%d xor %d = %d\n",
            ui8_one,
            ui8_two,
            ( u_int8_t )( ui8_one xor ui8_two ));
    /* output :
            3 xor 3 = 0
        ui8_one : 0000_0011 : 3
        ui8_two : 0000_0011 : 3
                  ---------
                  0000_0000 : 0 .*/

    printf( "%d xor_eq %d = %d\n",
            ui8_two,
            ui8_one,
            ( u_int8_t )( ui8_two xor_eq ui8_one ));
    /* output :
            3 xor_eq 3 = 0
        ui8_two : 0000_0011 : 3
        ui8_one : 0000_0011 : 3
                  ---------
        ui8_two   0000_0000 : 0 .*/

    printf( "compl %d  = ~%d = %d\n",
            ui8_two,
            ui8_two,
            ( u_int8_t ) compl ui8_two );
    /* output :
            compl 0  = ~0 = 255
        ui8_two   0000_0000 : 0
                  ---------
                  1111_1111 : 255 .*/


    printf( "compl %d = ~%d = %d\n",
            ui8_one,
            ui8_one,
            ( u_int8_t ) compl ui8_one );
    /* output :
            compl 3 = ~3 = 252
        ui8_one   0000_0011 : 3
                  ---------
                  1111_1100 : 252 */
    return 0; }

char * boolToString( bool aBool ){
/* convert a boolean to a string .*/
    return aBool == 1 ? "true" : "false";}