Solved

bitwise operator--complement

Posted on 2000-03-19
10
264 Views
Last Modified: 2010-04-15
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
 
 
0
Comment
Question by:kxm
10 Comments
 
LVL 2

Expert Comment

by:homer99
ID: 2633839
kxm try this:
#include <stdio.h>
int number[100];
main()
{
  number[1]=23;
  printf("%d", ~number[1]);
}
0
 
LVL 12

Expert Comment

by:pjknibbs
ID: 2633863
What result *are* you getting?
0
 
LVL 84

Expert Comment

by:ozo
ID: 2633908
changing "u%" to "%u" gets the correct result 232
0
 
LVL 1

Expert Comment

by:mahno
ID: 2635089
Ur program works correct:
23  = 00010111
232 = 11101000

0
 
LVL 2

Expert Comment

by:fremsley
ID: 2635417
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]));

0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
LVL 9

Expert Comment

by:Pacman
ID: 2636313
kxm, note that your code only converts the lo-byte of the integer.
0
 

Expert Comment

by:C_Dreamer
ID: 2656205
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. :-)

0
 

Accepted Solution

by:
balakrishnan_t earned 50 total points
ID: 2656889
I feel that what ozo and fremsley said r correct.

that is change u% to %u, u will get the correct answer 232. If that is not the answer u r looking to, then u views r wrong.

Integer is of 2 bytes, when u assign an integer to a character, the character gets allocated the least significant byte. In integer 23, the 2 bytes r as follows

 00000000 00010111

so the characters get the least significant byte 00010111. When u complement it the value will be 1110100, which is equivalent to 232 in decimal.

I hope u understood. If u want to take the complement of the whole integer, then the sign bit will be taken into account, and u will get a negative answer, since the sign bit gets complemented.
0
 

Expert Comment

by:C_Dreamer
ID: 2656949
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>
0
 

Author Comment

by:kxm
ID: 2657725
Thanks
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now