zero the last 13 bits of an unsigned long number

J

junky_fellow

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 ...
 
S

Skarmander

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.
 
T

Tom St Denis

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
 
R

Roberto Waltman

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;
 
D

Duncan Muirhead

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
 
J

junky_fellow

Duncan said:
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 ...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top