On Wednesday, 6 July 2016 at 21:44:37 UTC, BitGuy wrote:
I'm trying to implement a feistel cipher that'll give the same results regardless of the endianness of the machine it runs on. To make the cipher I need to split a 64bit value into two 32bit values, mess with them, and then put them back together. I can think of a few ways to split a 64bit value with versions or the endianness functions in bitmanip but it all seems pretty messy for just wanting to split a value... I'm thinking maybe I can just cast and bitshift so I can forget about the endianness but I'm not really sure about the casting down rules and if that'd work?

What about something like:

import std.stdio;

union Value
{
    ulong full;

    static struct Bits
    {
        uint high;
        uint low;
    }

    Bits bits;
    alias bits this;

    this(ulong value)
    {
        this.full = value;
    }
}

void main(string[] args)
{
    auto value = Value(77309411348);

    writefln("%s, (%b)", value.high, value.high);
    writefln("%s, (%b)", value.low, value.low);
    writefln("%s, (%b)", value.full, value.full);
}

Reply via email to