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
#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
What result *are* you getting?
changing "u%" to "%u" gets the correct result 232
Ur program works correct:
23 = 00010111
232 = 11101000
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]));
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. :-)
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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>
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>
ASKER
Thanks
#include <stdio.h>
int number[100];
main()
{
number[1]=23;
printf("%d", ~number[1]);
}