Ruud H.G. van Tol on Fri, 04 Jul 2025 12:39:02 +0200


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

Re: flags in a bitmap


On 2025-07-04 10:06, Bill Allombert wrote:
> On Thu, Jul 03, 2025 at 06:06:14PM +0200, Ruud H.G. van Tol wrote:

>> Bill, many thanks for the pointers, I'll explore.
>>
>> As an alternative, maybe add a Vecbits() or Vecflags() or such.
>> No idea if the first bit should have offset 0 or 1.
>> Only with bittest(), maybe 0?
>>
>> my(B=Vecbits([0], 987654321));
>> Vecbits_put(~B, 7654, v=1);  \\set the bit at offset 7654, by default to 1
>> Vecbits_put(~B, 7654, [1,0,0,1,1]); \\set bits 7654..7658 to [1,0,0,1,1]
>> my(b=Vecbits_get(B,7654)); \\get bit-7654
>> my(b=bittest(B,7653)); \\...

> What I can do is to allow to set/clean a bit in place inside an integer.
> However this would only work if the integer is large enough.
>
> I can do a git branch if you want to test:
>
> ? install(bitset,vWL)
> ? x=2^(2^20);
> ? forprime(p=2,2^20,bitset(~x,p))
>   ***   last result computed in 8 ms.
> ? my(S=0);for(i=0,2^20-1,S+=bittest(x,i));S
> %16 = 82025
>   ***   last result computed in 159 ms.

That indeed looks good, and I can test it.

The word "set" is overloaded! :)
(that is why I used "put" in my suggestions)

-- Ruud