From: "Pavlos" Newsgroups: comp.os.msdos.djgpp Subject: Re: shifting left, and shifting right... Date: Tue, 20 Jul 1999 05:20:18 +0300 Organization: An OTEnet S.A. customer Lines: 58 Message-ID: <7n0mc8$382$1@newssrv.otenet.gr> References: <37937D02 DOT 5D28D561 AT geocities DOT com> NNTP-Posting-Host: dram-a11.otenet.gr X-Trace: newssrv.otenet.gr 932437192 3330 195.167.113.234 (20 Jul 1999 02:19:52 GMT) X-Complaints-To: abuse AT otenet DOT gr NNTP-Posting-Date: 20 Jul 1999 02:19:52 GMT X-Newsreader: Microsoft Outlook Express 4.72.3110.1 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Sahab Yazdani wrote in message <37937D02 DOT 5D28D561 AT geocities DOT com>... >I'm having some trouble understanding bit-wise operations. Lets take a >transparency map as an example, it would be more efficeint to store the >transparency map as a pixel per bit bitmap (ie black and white), but I >have no clue how to store the individual pixels in the map. Somebody >told be that I have to use the shift left and right operators << & >>?? >Can anybody confirm this and also possibly send some code as to how to >do it??? Consider this byte: 0 0 0 0 1 0 0 0 <-only bit 3 is set 7 6 5 4 3 2 1 0 if you do the >> shift, it will become 0 0 0 0 0 1 0 0 which by the way is like dividing the byte with 2 and with << 0 0 0 1 0 0 0 0 like multiplying with 2 There are lots of ways to set the bits to 1 or 0. Which is the best, depends on what you want to do. A simple way is this: unsigned char b=2; the bits will be: 0 0 0 0 0 0 1 0 7 6 5 4 3 2 1 0 To set bit 2, you do: b|=4; and the bits will be: 0 0 0 0 0 1 1 0 7 6 5 4 3 2 1 0 To set any bit (not only in bytes, in integers too) you follow this: b|=(2 raised to the bit you want to set) So, 4 in my example is actually 2^2. To set the bit 3, 2^3=8 --> b|=8; You can set multiple bits at once like this: b|= (4 | 8); (set bit 2&3) To clear a bit, you should use the & (AND) like this: b=12; 0 0 0 0 1 1 0 0 7 6 5 4 3 2 1 0 b&=~8 will make b 0 0 0 0 0 1 0 0 What is the '~'? this make the '8' which is 0 0 0 0 1 0 0 0 to 1 1 1 1 0 1 1 1 So when you to the AND, it's like saying leave all the other bits as they are and clear bit 3. I hope this helps (and I haven't made a mistake :) Pavlos