Bitfields

Basile B. b2.temp at gmx.com
Wed May 22 09:07:01 UTC 2019


On Wednesday, 22 May 2019 at 08:54:45 UTC, Russel Winder wrote:
> On Tue, 2019-05-21 at 19:14 +0000, Era Scarecrow via 
> Digitalmars-d-learn wrote:
>> 
> […]
>>   I worked on/with bitfields in the past, the limit sizes is 
>> more
>> or less for natural int types that D supports.
>
> Rust bitfield crate and it's macros are the same, the 
> underlying type for a bitfield must be a primitive integer 
> type. Fortunately, Rust has i128 and u128 which is enough for 
> my 112 bit EIT header.
>
> Boris Barboris suggested using BitArray and I willinvestigate 
> but the size_t/byte problem would need to go away.
>
>>   However this limitation is kinda arbitrary, as for 
>> simplicity it
>> relies on shifting bits, going larger or any byte size is
>> possible depending on what needs to be stored, but ti's the 
>> speed
>> that really takes a penalty when you aren't using native types 
>> or
>> you have to do a lot of shifting to get the job done.
>> 
>>   What's the layout of what you need? I'll see if i can't make
>> something that would work for you.
>> 
>>   Would be better if you can use a object that breaks the parts
>> down and you can actually fully access those parts, then just
>> re-store it into the limited space you want for storage, which
>> then would be faster than bitfields (although not by much)
>
> I found an interesting way forward in the source code of 
> dvbsnoop. It basically uses the byte sequence as a backing 
> store and then has a function to do the necessary accesses to 
> treat it as a bit array.
>
> If D's Bit Array can work with bytes instead of size_t then it 
> is exactly what dvbsnoop does (in C) but adds writing as well 
> as reading.
>
> The Rust solution using bitfield with a u128 backing it seems 
> to work, but it is all very clumsy even if it is efficacious.

If the type of operations you need on your 128 bit container is 
simple enough (bitwise op) you can implement them, backed by two 
ulong in a custom struct.
I did something similar for the tokens if my language[1]. There 
are probably wrong stuff in there but for my usage (include and 
bt) that works seamlessly.

[1]: 
https://github.com/Basile-z/styx/blob/master/src/styx/data_structures.d#L40


More information about the Digitalmars-d-learn mailing list