Solved

bitwise operator--complement

Posted on 2000-03-19
10
249 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
Comment Utility
kxm try this:
#include <stdio.h>
int number[100];
main()
{
  number[1]=23;
  printf("%d", ~number[1]);
}
0
 
LVL 12

Expert Comment

by:pjknibbs
Comment Utility
What result *are* you getting?
0
 
LVL 84

Expert Comment

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

Expert Comment

by:mahno
Comment Utility
Ur program works correct:
23  = 00010111
232 = 11101000

0
 
LVL 2

Expert Comment

by:fremsley
Comment Utility
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
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 
LVL 9

Expert Comment

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

Expert Comment

by:C_Dreamer
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
Thanks
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.

772 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

10 Experts available now in Live!

Get 1:1 Help Now