tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: 64-bit masks



On Fri, Nov 27, 2009 at 02:06:38PM -0000, Sad Clouds wrote:
> Hi I'm writing a shared library and have a two part question:
> 
> 1. What is the correct (portable?) way of specifying 64-bit constants?
> 
> If I need a 64-bit constant set to all 1s, will the following work on all  
> systems
> 
> unit64_t num = 0xffffffffffffffffULL;

Adding my tuppence... ~(uint64_t)0

Or, for true portability (even then assuming 'long' is 32bit):
#define CONST64(u,l) ((uint64_t)(u) << 16 | (l))
then use: CONST64(0xfffffffful,0xfffffffful)

> 2. I have an array of 64 objects that I need to keep track of. I keep  
> their state (i.e. busy/free) in a 64-bit mask, 1 for busy, 0 for free.

...

If you want a fast way of finding a free slot, then you might
want to use a freelist, eg allocate a char[64] array and use a zero
to mean allocated, non-zero free - with the value that of the next
free item, 0xff meaning no more free.

The 64 byte map may well generate faster code, even for storing just
0 and 1. Especially true on systems that do not have native 64bit support.

        David

-- 
David Laight: david%l8s.co.uk@localhost


Home | Main Index | Thread Index | Old Index