I don't get how the following expression gets simplified

This is a discussion on I don't get how the following expression gets simplified within the C Programming forums, part of the General Programming Boards category; I was told the following Code: if ( (a && b) || (!a && !b) ) was equivalent to Code: ...

  1. #1
    Banned
    Join Date
    May 2007
    Location
    Berkeley, CA
    Posts
    329

    I don't get how the following expression gets simplified

    I was told the following
    Code:
    if ( (a && b) || (!a && !b) )
    was equivalent to

    Code:
    if(!!a == !!b)
    Can someone explain to me how they arrive at this answer? I really don't see the steps involved.

  2. #2
    Captain Crash brewbuck's Avatar
    Join Date
    Mar 2007
    Location
    Portland, OR
    Posts
    7,052
    Quote Originally Posted by Overworked_PhD View Post
    I was told the following
    Code:
    if ( (a && b) || (!a && !b) )
    was equivalent to

    Code:
    if(!!a == !!b)
    Can someone explain to me how they arrive at this answer? I really don't see the steps involved.
    The first expression evaluates to true if both a and b are true, or if neither a nor b are true. Since any non-zero value is true, then you cannot just condense this to "a == b". But if you double-negate, then a true value negates to zero, then negates to one, and then the comparison will work.

    If only we had a logical XOR (as opposed to bitwise), we could say:

    Code:
    if( ! ( a ^^ b ) )
    But alas we don't.
    Code:
    //try
    //{
    	if (a) do { f( b); } while(1);
    	else   do { f(!b); } while(1);
    //}

  3. #3
    Banned
    Join Date
    May 2007
    Location
    Berkeley, CA
    Posts
    329
    Okay. I get it.

  4. #4
    Guest Sebastiani's Avatar
    Join Date
    Aug 2001
    Posts
    5,439
    It could be further simplified to either:

    !a == !b

    - or -

    !( !a ^ !b )
    Code:
    int main(void){srand(time(0));for(double l=rand(),l0=0,l00=0;;l0+=0.1){for(double l000=0;l000
    <1;l000+=.001,l+=((double)rand()/RAND_MAX)/0x64,l00+=((sin(l*0x8*atan(l0)*l000-(l0*0x8*atan
    (l)))*0.5)+0.5)){l00-=floor(l00);for(size_t l0000=0,l00000=(size_t)(0x50*(l00));l0000<l00000;++l0000
    )putchar(0x20);putchar(0x61+(int)((double)rand()/RAND_MAX*0x1a));putchar('\n');}}return 0;}

  5. #5
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,681
    Quote Originally Posted by Sebastiani View Post
    It could be further simplified to either:

    !a == !b

    - or -

    !( !a ^ !b )
    The first one is going to be the faster of those two, I'm pretty sure.

    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Help with making a Math Expression DLL
    By MindWorX in forum C Programming
    Replies: 19
    Last Post: 07-19-2007, 11:37 PM
  2. Screwy Linker Error - VC2005
    By Tonto in forum C++ Programming
    Replies: 5
    Last Post: 06-19-2007, 02:39 PM
  3. recursion error
    By cchallenged in forum C Programming
    Replies: 2
    Last Post: 12-18-2006, 08:15 AM
  4. Please Help - Problem with Compilers
    By toonlover in forum C++ Programming
    Replies: 5
    Last Post: 07-23-2005, 10:03 AM
  5. Expression Evaluator Contest
    By Stack Overflow in forum Contests Board
    Replies: 20
    Last Post: 03-29-2005, 09:34 AM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21