int findComplement(int num)
{
    int TotalBits = 0;
    int temp = num;
    while (temp)
    {  // To find position of MSB in given num. Since num is represented as a
       // standard size in memory, we cannot rely on size for that information.
        TotalBits++;  // increment TotalBits till temp becomes 0
        temp >>= 1;   // shift temp right by 1 bit every iteration; temp loses 1
                      // bit to underflow every iteration till it becomes 0
    }
    int i,
        flipNumber = 1;  // Eg: 1's complement of 101(binary) can be found as
                         // 101^111 (XOR with 111 flips all bits that are 1 to 0
                         // and flips 0 to 1)
    for (i = 1; i < TotalBits; i++)
    {
        flipNumber += UINT32_C(1)
                      << i;  // Note the use of unsigned int to facilitate left
                             // shift more than 31 times, if needed
    }
    num = num ^ flipNumber;
    return num;
}

476