...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

ビット列としての取り扱い(2)

Oh!
http://d.hatena.ne.jp/satoru_h/20090629/p1
std.bitmanipを使う必要がないことに気づかされたので工夫してみた*1

import std.stdio;
import std.typecons;
//import std.file;

union UnionCast(T, U...)
{
	T value;
	struct
	{
		U elems;
	}
}

void main()
{
	uint[] buf = [0x000f,0x00ff,0x0fff];//cast(uint[])read("binary.dat");
	
	{
		UnionCast!(Tuple!(uint,uint,uint), double, uint) c;
		c.value.field[0] = buf[0];
		c.value.field[1] = buf[1];
		c.value.field[2] = buf[2];
		writeln(c.value);
		writeln(c.elems[0]);
		writeln(c.elems[1]);
	}
	
	{
		UnionCast!(Tuple!(uint,uint,uint), uint, double) c;
		c.value.field[0] = buf[0];
		c.value.field[1] = buf[1];
		c.value.field[2] = buf[2];
		writeln(c.value);
		writeln(c.elems[0]);
		writeln(c.elems[1]);
	}
}

Tuple!(uint,uint,uint)(15, 255, 4095)
5.41109e-312
4095
Tuple!(uint,uint,uint)(15, 255, 4095)
15
2.0232e-320

何でもテンプレートにしてみたら何となくかっこよく見えるlifehack

気にくわねぇな

c.valueに1つずつ代入しているところはどうにかならないのだろうか.

とりあえず

c.value = tuple(buf[0], buf[1], buf[2]);

こういうのがあることはわかった.

*1:ICFPCのためのコーディングの中で3つのuintから(double,uint)もしくは(uint,double)に分解する場面があった.