Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Using bitshift in assigning a number to a variable? (http://www.velocityreviews.com/forums/t316707-using-bitshift-in-assigning-a-number-to-a-variable.html)

bollod 12-25-2003 10:51 PM

Using bitshift in assigning a number to a variable?
 
Is there any benefit to declaring a variable:

x = (1<<12);

instead of:

x = 4096;

(besides the geek appeal of course ;-) )

I have seen these kind of declarations come up in some code I have been
fiddling with and was wondering if there was any tangible benefit, (I have
also seen stuff declared as hex, is there any benefit to that either).

---
bollod



bollod 12-25-2003 11:28 PM

Re: Using bitshift in assigning a number to a variable?
 
On Fri, 26 Dec 2003 04:03:30 +0000, pete wrote:

> bollod wrote:
>>
>> Is there any benefit to declaring a variable:
>>
>> x = (1<<12);
>>
>> instead of:
>>
>> x = 4096;
>>
>> (besides the geek appeal of course ;-) )
>>
>> I have seen these kind of declarations come up
>> in some code I have been
>> fiddling with and was wondering if there was any tangible benefit,
>> (I have also seen stuff declared as hex,
>> is there any benefit to that either).

>
> It's easier to visualise the binary representation
> of the values that way,
> which is especially good if your numbers are masks.


That makes sense.

What would you do if you needed to create the mask '10101010' (besides
foo=170 or foo=0xA4)?

---
bollod

pete 12-26-2003 04:03 AM

Re: Using bitshift in assigning a number to a variable?
 
bollod wrote:
>
> Is there any benefit to declaring a variable:
>
> x = (1<<12);
>
> instead of:
>
> x = 4096;
>
> (besides the geek appeal of course ;-) )
>
> I have seen these kind of declarations come up
> in some code I have been
> fiddling with and was wondering if there was any tangible benefit,
> (I have also seen stuff declared as hex,
> is there any benefit to that either).


It's easier to visualise the binary representation
of the values that way,
which is especially good if your numbers are masks.

--
pete

pete 12-26-2003 06:12 AM

Re: Using bitshift in assigning a number to a variable?
 
bollod wrote:
>
> On Fri, 26 Dec 2003 04:03:30 +0000, pete wrote:
>
> > bollod wrote:
> >>
> >> Is there any benefit to declaring a variable:
> >>
> >> x = (1<<12);
> >>
> >> instead of:
> >>
> >> x = 4096;
> >>
> >> (besides the geek appeal of course ;-) )
> >>
> >> I have seen these kind of declarations come up
> >> in some code I have been
> >> fiddling with and was wondering if there was any tangible benefit,
> >> (I have also seen stuff declared as hex,
> >> is there any benefit to that either).

> >
> > It's easier to visualise the binary representation
> > of the values that way,
> > which is especially good if your numbers are masks.

>
> That makes sense.
>
> What would you do if you needed to create the mask '10101010' (besides
> foo=170 or foo=0xA4)?


'10101010' looks more like 0xaa to me.

The shift notation is better
when the right operand of the shift operator
is an enum or a macro identifier which indicates which flag
the mask applies to.

--
pete

Robert Bachmann 12-26-2003 09:01 AM

Re: Using bitshift in assigning a number to a variable?
 
bollod wrote:
> What would you do if you needed to create the mask '10101010' (besides
> foo=170 or foo=0xA4)?


I would write
#define SOME_MASK (1<<7 | 1<<5 | 1<<3 | 1<<1)
or
const int SOME_MASK=1<<7 | 1<<5 | 1<<3 | 1<<1;

--
Robert.Bachmann@rbdev.net

those who know me have no need of my name 12-26-2003 07:32 PM

Re: Using bitshift in assigning a number to a variable?
 
in comp.lang.c i read:

>What would you do if you needed to create the mask '10101010' (besides
>foo=170 or foo=0xA4)?


correction: foo=0xAA. also foo=0252 and foo=strtol("10101010", 0, 2),
though the later cannot be used at file scope.

--
a signature

Darrell Grainger 12-27-2003 03:51 AM

Re: Using bitshift in assigning a number to a variable?
 
On Thu, 25 Dec 2003, bollod wrote:

> Is there any benefit to declaring a variable:
>
> x = (1<<12);
>
> instead of:
>
> x = 4096;
>
> (besides the geek appeal of course ;-) )
>
> I have seen these kind of declarations come up in some code I have been
> fiddling with and was wondering if there was any tangible benefit, (I have
> also seen stuff declared as hex, is there any benefit to that either).


I'll answer the easier question first, there is a benefit to hexidecimal
notation. When I am doing bit twiddling it is easier to visualize the bit
pattern what using hexidecimal notation. One digit in hexidecimal notation
is exactly 4 bits.

The harder question is why use (1<<12) rather than 4096. If they used
0x1000 it would be more obvious. I'd guess that 99% of the time this is
just more readable. Another possible option is that someone was tuning the
code and found a 'trick' for a particular processor/compiler.

It is not impossible that a compiler will take:

x = (1<<12);

and optimize it to a STORE IMMEDIATE 1 and SHIFT opcode. The cycle count
for this might be faster than trying to assign 4096. This is a stretch but
not impossible. Mind you, I'd put a comment next to the code in case a
revision in the compiler or a port to a different architecture made this
tweek disappear.

--
Send e-mail to: darrell at cs dot toronto dot edu
Don't send e-mail to vice.president@whitehouse.gov

Sean Kenwrick 12-27-2003 10:05 AM

Re: Using bitshift in assigning a number to a variable?
 

"bollod" <bollod@lycos.com> wrote in message
news:pan.2003.12.25.23.28.11.856591@lycos.com...
> On Fri, 26 Dec 2003 04:03:30 +0000, pete wrote:
>
> > bollod wrote:
> >>
> >> Is there any benefit to declaring a variable:
> >>
> >> x = (1<<12);
> >>
> >> instead of:
> >>
> >> x = 4096;
> >>
> >> (besides the geek appeal of course ;-) )
> >>
> >> I have seen these kind of declarations come up
> >> in some code I have been
> >> fiddling with and was wondering if there was any tangible benefit,
> >> (I have also seen stuff declared as hex,
> >> is there any benefit to that either).

> >
> > It's easier to visualise the binary representation
> > of the values that way,
> > which is especially good if your numbers are masks.

>
> That makes sense.
>
> What would you do if you needed to create the mask '10101010' (besides
> foo=170 or foo=0xA4)?
>
> ---
> bollod


x=2<<6|2<<4|2<<2|2;

or

x=10<<4|10;

or

x=5<<5|5<<1;

or

x=85<<1;


But now its just getting silly.....

Sean



Richard Heathfield 12-27-2003 11:12 AM

Re: Using bitshift in assigning a number to a variable?
 
bollod wrote:

> On Fri, 26 Dec 2003 04:03:30 +0000, pete wrote:
>
>> It's easier to visualise the binary representation
>> of the values that way,
>> which is especially good if your numbers are masks.

>
> That makes sense.
>
> What would you do if you needed to create the mask '10101010' (besides
> foo=170 or foo=0xA4)?


#define l )*2+1
#define O )*2
#define b1 ((((((((0

unsigned char foo = b1 l O l O l O l O ;

--
Richard Heathfield : binary@eton.powernet.co.uk
"Usenet is a strange place." - Dennis M Ritchie, 29 July 1999.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
K&R answers, C books, etc: http://users.powernet.co.uk/eton

Robert Bachmann 12-27-2003 01:05 PM

Re: Using bitshift in assigning a number to a variable?
 
bollod wrote:
> Is there any benefit to declaring a variable:
>
> x = (1<<12);
>
> instead of:
>
> x = 4096;
>
> (besides the geek appeal of course ;-) )

If x is used as a "common variable" I can see no benefit.

But if x is used as some kind of bit-mask you got the benefit of
immediately seeing that the value of x is 1000000000000 in binary notation.

As (1<<n) can be read as 1 followed by n zero digits in binary notation.
For example: 1<<3 is 1000 in binary.

> (I have also seen stuff declared as hex, is there any benefit to that either).


Hexadecimal notation is also very common when using bit-masks.
As Darrell Grainger already said:
| One digit in hexidecimal notation
| is exactly 4 bits.

So if you familiar with hexadecimal notation it's easy to see that
0x1000 (4096) is 1000000000000.

I also have seen code with bit-masks in octal notation (one digit in
octal notation represents 3 bits).

HTH,
Robert

--
Robert.Bachmann@rbdev.net


All times are GMT. The time now is 07:53 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.