Mail Archives: djgpp/1999/07/20/12:30:17
From: | "Pavlos" <trash24379 AT usa DOT net>
|
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
- Raw text -