Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > extracting front bits from an unsigned long long?

Reply
Thread Tools

extracting front bits from an unsigned long long?

 
 
Digital Puer
Guest
Posts: n/a
 
      11-11-2005
Hi, suppose I have an unsigned long long. I would like to extract
the front 'n' bits of this value and convert them into an integer.
For example, if I extract the first 3 bits, I would get an int between
0 and 7 (=2^3-1). Could someone please help out?

I can assume the largest returned value fits in an int. Also,
I'm on a big-endian PPC (AIX), in case that matters.

Ideally, I'd like to implement a prototype like:
int extractFrontBits(unsigned long long value, int num_bits);

 
Reply With Quote
 
 
 
 
pete
Guest
Posts: n/a
 
      11-11-2005
Digital Puer wrote:
>
> Hi, suppose I have an unsigned long long. I would like to extract
> the front 'n' bits of this value and convert them into an integer.
> For example, if I extract the first 3 bits, I would get an int between
> 0 and 7 (=2^3-1). Could someone please help out?


int three_bits = long_long_value & 7;

--
pete
 
Reply With Quote
 
 
 
 
slebetman@yahoo.com
Guest
Posts: n/a
 
      11-11-2005
Digital Puer wrote:
> Hi, suppose I have an unsigned long long. I would like to extract
> the front 'n' bits of this value and convert them into an integer.
> For example, if I extract the first 3 bits, I would get an int between
> 0 and 7 (=2^3-1). Could someone please help out?
>
> I can assume the largest returned value fits in an int. Also,
> I'm on a big-endian PPC (AIX), in case that matters.
>
> Ideally, I'd like to implement a prototype like:
> int extractFrontBits(unsigned long long value, int num_bits);


I'm guessing long long is 64 bits? Regardless, the following should
work:

frontbits = (original_value >> (sizeof(long long) - 3)) & 0x03;

The masking at the end is to zero out the msb of the result since on
some systems it doesn't get zeroed.

If number of bits is not fixed, then it would look something like the
following:

frontbits = original_value >> (sizeof(long long) - num_bits);

but the masking will get complicated.

 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-11-2005
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
>
> Digital Puer wrote:
> > Hi, suppose I have an unsigned long long. I would like to extract
> > the front 'n' bits of this value and convert them into an integer.
> > For example, if I extract the first 3 bits,
> > I would get an int between
> > 0 and 7 (=2^3-1). Could someone please help out?


> I'm guessing long long is 64 bits? Regardless, the following should
> work:


> frontbits = (original_value >> (sizeof(long long) - 3)) & 0x03;


You're getting 2 bits from the middle of the value.
Anything & 3, ain't going to get you more than 2 bits.
You shift the original value to the right
and the low order bits disappear.

--
pete
 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-11-2005
pete wrote:
>
> Digital Puer wrote:
> >
> > Hi, suppose I have an unsigned long long. I would like to extract
> > the front 'n' bits of this value and convert them into an integer.
> > For example, if I extract the first 3 bits,
> > I would get an int between
> > 0 and 7 (=2^3-1). Could someone please help out?

>
> int three_bits = long_long_value & 7;


n bits, ... hmm ...

long_long_value & ((1ULL << n) - 1)

--
pete
 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      11-11-2005
On 10 Nov 2005 16:59:21 -0800, "Digital Puer"
<(E-Mail Removed)> wrote:

>Hi, suppose I have an unsigned long long. I would like to extract
>the front 'n' bits of this value and convert them into an integer.
>For example, if I extract the first 3 bits, I would get an int between
>0 and 7 (=2^3-1). Could someone please help out?
>
>I can assume the largest returned value fits in an int. Also,
>I'm on a big-endian PPC (AIX), in case that matters.
>
>Ideally, I'd like to implement a prototype like:
>int extractFrontBits(unsigned long long value, int num_bits);


Shift the value in the variable to the right
(sizeof(unsigned long long)*CHAR_BIT - n)
bits. The result is the integer you requested.


<<Remove the del for email>>
 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      11-11-2005
"Digital Puer" <(E-Mail Removed)> writes:
> Hi, suppose I have an unsigned long long. I would like to extract
> the front 'n' bits of this value and convert them into an integer.
> For example, if I extract the first 3 bits, I would get an int between
> 0 and 7 (=2^3-1). Could someone please help out?


What do you mean by "front" bits?

--
Keith Thompson (The_Other_Keith) (E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
slebetman@yahoo.com
Guest
Posts: n/a
 
      11-11-2005

pete wrote:
> (E-Mail Removed) wrote:
> >
> > Digital Puer wrote:
> > > Hi, suppose I have an unsigned long long. I would like to extract
> > > the front 'n' bits of this value and convert them into an integer.
> > > For example, if I extract the first 3 bits,
> > > I would get an int between
> > > 0 and 7 (=2^3-1). Could someone please help out?

>
> > I'm guessing long long is 64 bits? Regardless, the following should
> > work:

>
> > frontbits = (original_value >> (sizeof(long long) - 3)) & 0x03;

>
> You're getting 2 bits from the middle of the value.
> Anything & 3, ain't going to get you more than 2 bits.
> You shift the original value to the right
> and the low order bits disappear.
>
> --
> pete


Ah, sorry, it should be:

frontbits = (original_value >> (sizeof(long long) - 3)) & 0x07;

 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-11-2005
(E-Mail Removed) wrote:
>
> pete wrote:
> > (E-Mail Removed) wrote:
> > >
> > > Digital Puer wrote:
> > > > Hi, suppose I have an unsigned long long.
> > > > I would like to extract
> > > > the front 'n' bits of this value and convert them
> > > > into an integer.
> > > > For example, if I extract the first 3 bits,
> > > > I would get an int between
> > > > 0 and 7 (=2^3-1). Could someone please help out?

> >
> > > I'm guessing long long is 64 bits?
> > > Regardless, the following should
> > > work:

> >
> > > frontbits =
> > > (original_value >> (sizeof(long long) - 3)) & 0x03;

> >
> > You're getting 2 bits from the middle of the value.
> > Anything & 3, ain't going to get you more than 2 bits.
> > You shift the original value to the right
> > and the low order bits disappear.


> Ah, sorry, it should be:
>
> frontbits = (original_value >> (sizeof(long long) - 3)) & 0x07;


Barry Schwarz also seems to think that shifting the original
value to the right, is the right thing to do.
I don't get it.

I'll assume you think that CHAR_BIT is 8.
That makes your 64 bit bit long long, 8 bytes in size.
8 - 3 is two, so you shift your unsigned long long
two bits to the right, which is equivalent to dividing by 4,
and then you take the 3 lower order bits.
What is that?

--
pete
 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-11-2005
Digital Puer wrote:
>
> Hi, suppose I have an unsigned long long. I would like to extract
> the front 'n' bits of this value and convert them into an integer.
> For example, if I extract the first 3 bits, I would get an int between
> 0 and 7 (=2^3-1). Could someone please help out?
>
> I can assume the largest returned value fits in an int. Also,
> I'm on a big-endian PPC (AIX), in case that matters.
>
> Ideally, I'd like to implement a prototype like:
> int extractFrontBits(unsigned long long value, int num_bits);


int extractFrontBits(unsigned long long value, int num_bits)
{
return (int)(value & ((1ULL << num_bits) - 1))
}

--
pete
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Shifting unsigned long long values by 64 bits krunalb C Programming 10 01-23-2007 02:47 PM
what about unsigned and signed 8 bits number, 16 bits, etc?? sarmin kho Python 2 06-15-2004 06:40 PM
Re: what about unsigned and signed 8 bits number, 16 bits, etc?? Miki Tebeka Python 1 06-14-2004 03:19 PM
8-Bits vs 12 or 16 bits/pixel; When does more than 8 bits count ? Al Dykes Digital Photography 3 12-29-2003 07:08 PM
Assigning unsigned long to unsigned long long George Marsaglia C Programming 1 07-08-2003 05:16 PM



Advertisments