For Programmers: Free Programming Magazines  


Home > Archive > C > June 2006 > zero the last 13 bits of an unsigned long number









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author zero the last 13 bits of an unsigned long number
junky_fellow@yahoo.co.in

2006-06-27, 6:56 pm

Hi guys,

I have some value stored in an unsigned long integer. My
requirement is to
zero the 13 LSB bits of this number. Or more specifically, I want to
make the number
8k (8192) aligned. For instance, if the value is 26 kilobytes I should
get 24kilobytes.
Can somebody tell me a portable way of doing it. I thought of
using a mask 0xfffe0000, but that won't work if long is 8 bytes long on
some other
machine. I also thought of right shifting the number by 13 bits and
again left shifting it
by 13. But, I don't know if this is a good way of soing it.
Can anyone sugggest me a cleaner way of doing it ?

thanks a lot for any help ...

Skarmander

2006-06-27, 6:56 pm

junky_fellow@yahoo.co.in wrote:
> Hi guys,
>
> I have some value stored in an unsigned long integer. My
> requirement is to
> zero the 13 LSB bits of this number. Or more specifically, I want to
> make the number
> 8k (8192) aligned. For instance, if the value is 26 kilobytes I should
> get 24kilobytes.
> Can somebody tell me a portable way of doing it. I thought of
> using a mask 0xfffe0000, but that won't work if long is 8 bytes long on
> some other
> machine. I also thought of right shifting the number by 13 bits and
> again left shifting it
> by 13. But, I don't know if this is a good way of soing it.
> Can anyone sugggest me a cleaner way of doing it ?
>


#include <limits.h>
unsigned long mask_lsb13(unsigned long x) {
return x & (ULONG_MAX << 13);
}

S.
Tom St Denis

2006-06-27, 6:56 pm


junky_fellow@yahoo.co.in wrote:
> Hi guys,
>
> I have some value stored in an unsigned long integer. My
> requirement is to
> zero the 13 LSB bits of this number. Or more specifically, I want to
> make the number
> 8k (8192) aligned. For instance, if the value is 26 kilobytes I should
> get 24kilobytes.
> Can somebody tell me a portable way of doing it. I thought of
> using a mask 0xfffe0000, but that won't work if long is 8 bytes long on
> some other
> machine. I also thought of right shifting the number by 13 bits and
> again left shifting it
> by 13. But, I don't know if this is a good way of soing it.
> Can anyone sugggest me a cleaner way of doing it ?


Um what about

x &= ~((1UL<<13) - 1UL)

btw the mask should be 0xFFFFE000 for 32-bit platforms :-)

Tom

Roberto Waltman

2006-06-27, 6:56 pm

<junky_fellow@yahoo.co.in> wrote:
> I have some value stored in an unsigned long integer. My
>requirement is to
>zero the 13 LSB bits of this number. Or more specifically, I want to
>make the number
>8k (8192) aligned. For instance, if the value is 26 kilobytes I should
>get 24kilobytes.
>Can somebody tell me a portable way of doing it. I thought of
>using a mask 0xfffe0000, but that won't work if long is 8 bytes long on
>some other
>machine. I also thought of right shifting the number by 13 bits and
>again left shifting it
>by 13. But, I don't know if this is a good way of soing it.
>Can anyone sugggest me a cleaner way of doing it ?


unsigned long mask = ~0x1fffUL;
Duncan Muirhead

2006-06-27, 6:56 pm

On Tue, 27 Jun 2006 07:35:46 -0700, junky_fellow@yahoo.co.in wrote:

> Hi guys,
>
> I have some value stored in an unsigned long integer. My
> requirement is to
> zero the 13 LSB bits of this number. Or more specifically, I want to
> make the number
> 8k (8192) aligned. For instance, if the value is 26 kilobytes I should
> get 24kilobytes.
> Can somebody tell me a portable way of doing it. I thought of
> using a mask 0xfffe0000, but that won't work if long is 8 bytes long on
> some other
> machine. I also thought of right shifting the number by 13 bits and
> again left shifting it
> by 13. But, I don't know if this is a good way of soing it.
> Can anyone sugggest me a cleaner way of doing it ?
>
> thanks a lot for any help ...

It's conceivable, I suppose, that you might save a femtogrunt by twiddling
bits, but I think arithmetic is clearer:
size -= size % 8192;
(and a good optimiser may well implement that as bit twiddling)
Duncan


junky_fellow@yahoo.co.in

2006-06-27, 6:56 pm


Duncan Muirhead wrote:
> On Tue, 27 Jun 2006 07:35:46 -0700, junky_fellow@yahoo.co.in wrote:
>
> It's conceivable, I suppose, that you might save a femtogrunt by twiddling
> bits, but I think arithmetic is clearer:
> size -= size % 8192;
> (and a good optimiser may well implement that as bit twiddling)


thanks Dunkan. This really looks great ...

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2009 codecomments.com