Link to home
Start Free TrialLog in
Avatar of kxm
kxm

asked on

bitwise operator--complement

I want to use bitwise operator--complement on an integer array. Here is my code:

#include <stdio.h>
int number[100];
unsigned char temp[100],complement[100];

main()
{
  number[1]=23;
/*type cast integer*/
  temp[1]=(unsigned char)(number[1]);
/*use complement operator*/
  complement[1]=~temp[1];
  printf("u%",complement[1]);
  return 0;
}

I didn't get the correct result,.Is there anything wrong?

Thanks, --km
 
 
Avatar of homer99
homer99

kxm try this:
#include <stdio.h>
int number[100];
main()
{
  number[1]=23;
  printf("%d", ~number[1]);
}
What result *are* you getting?
Avatar of ozo
changing "u%" to "%u" gets the correct result 232
Ur program works correct:
23  = 00010111
232 = 11101000

i guess 'u%' was just a typo.

complement[1] is of type unsigned char, so printf only pushes 8 significant bits as parameter on the stack; the '%u' tells printf to treat the parameter as an unsigned int (usually 32 significant bits). so try:

  printf("%u", (unsigned int)(complement[i]));

kxm, note that your code only converts the lo-byte of the integer.
Note further that you shouldn't really muck about with the sign bit of a signed int.

If you're going to twiddle bits, do it on unsigned types.

Here's a safe bit-twiddler:

unsigned int bitwiseNot(unsigned int n)
{
  return ~n;
}

Wow, that was a tough one. :-)

ASKER CERTIFIED SOLUTION
Avatar of balakrishnan_t
balakrishnan_t

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
An int is not necessarily two bytes. It's sizeof(int) bytes. Under Visual C++ 1.5, that gives you a value of 2. Under Visual C++ 5.0, it gives you a value of 4. On a Cray, sizeof(int) is 8.

Furthermore, bear in mind that bytes don't necessarily have 8 bits. They have /at least/ 8 bits. To find out how many bits per byte in your implementation, print out the value of CHAR_BIT (in <limits.h>). Of course, it's 99 chances out of 100 that it'll be 8! :-)

The problem with twiddling bits on an int is that you are assuming your representation is twos complement. On ones complement machines, you'll get a totally different result. Hence my earlier admonition.

I certainly agree that changing u% to %u is likely to result in more effective display of the result. <grin>
Avatar of kxm

ASKER

Thanks