From 94e13d7ad0e8b5488eef4e345f630001a2e314ae Mon Sep 17 00:00:00 2001 From: Charles Iliya Krempeaux Date: Sun, 7 Nov 2021 00:56:21 -0700 Subject: [PATCH] initial commits --- compile.go | 31 ++ compile_test.go | 885 ++++++++++++++++++++++++++++++++++++++++++++++ decompile_test.go | 442 +++++++++++++++++++++++ 3 files changed, 1358 insertions(+) create mode 100644 compile.go create mode 100644 compile_test.go create mode 100644 decompile_test.go diff --git a/compile.go b/compile.go new file mode 100644 index 0000000..edeaa0e --- /dev/null +++ b/compile.go @@ -0,0 +1,31 @@ +package iid + +const ( + maxbitwidth = 64 +) + +const ( + maskfirst = 0b0111111111111111111111111111111111111111000000000000000000000000 + masksecond = 0b0000000000000000000000000000000000000000111111111111111111111111 +) + +const ( + widthfirst = 40 + widthsecond = maxbitwidth - widthfirst +) + +func compile(first uint64, second uint64) uint64 { + + var compiled uint64 = ((first << widthsecond) & maskfirst) | (second & masksecond) + + return compiled + +} + +func decompile(value uint64) (uint64, uint64) { + + var first uint64 = (value & maskfirst) >> widthsecond + var second uint64 = value & masksecond + + return first, second +} diff --git a/compile_test.go b/compile_test.go new file mode 100644 index 0000000..c945a55 --- /dev/null +++ b/compile_test.go @@ -0,0 +1,885 @@ +package iid + +import ( + "testing" +) + +func TestCompile(t *testing.T) { + + tests := []struct{ + First uint64 + Second uint64 + Expected uint64 + }{ + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000000001, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000001000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000000010, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000010000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000000100, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000100000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000001000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000001000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000010000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000010000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000000100000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000100000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000001000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000001000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000010000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000010000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000000100000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000100000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000001000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000001000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000010000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000010000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000000100000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000100000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000001000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000001000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000010000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000010000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000000100000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000100000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000001000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000001000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000010000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000010000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000000100000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000100000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000001000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000001000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000010000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000010000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000000100000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000100000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000001000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000001000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000010000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000010000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000000100000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000100000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000001000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000001000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000010000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000010000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000000100000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000100000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000001000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000001000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000010000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000010000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000000100000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000100000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000001000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000001000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000010000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000010000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000000100000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000100000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000001000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000001000000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000010000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000010000000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000000100000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000100000000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000001000000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0001000000000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000010000000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0010000000000000000000000000000000000000000000000000000000000000, + // ^ + }, + { + // v + First: 0b0000000000000000000000000100000000000000000000000000000000000000, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0100000000000000000000000000000000000000000000000000000000000000, + // ^ + }, + + + + + + + + + + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0100000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0010000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0001000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000100000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000010000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000001000000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000100000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000010000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000001000000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000100000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000010000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000001000000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000100000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000010000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000001000000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000100000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000010000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000001000000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000100000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000010000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000001000000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000100000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000010000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000001000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000100000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000010000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000001000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000100000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000010000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000001000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000100000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000010000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000001000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000100000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000010000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000001000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000100000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000010000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000001000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + + + + + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000100000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000100000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000010000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000010000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000001000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000001000000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000100000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000100000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000010000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000010000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000001000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000001000000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000100000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000100000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000010000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000010000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000001000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000001000000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000100000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000100000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000010000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000010000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000001000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000001000000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000100000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000100000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000010000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000010000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000001000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000001000000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000100000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000100000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000010000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000010000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000001000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000001000000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000100000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000100000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000010000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000010000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000001000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000001000, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000000100, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000100, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000000010, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000010, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v + Second: 0b0000000000000000000000000000000000000000000000000000000000000001, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000001, + }, + + + + + + + + + + { + // v v + First: 0b0000000000000000000000000100000000000000000000000000000000000001, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0100000000000000000000000000000000000001000000000000000000000000, + // ^ ^ + }, + + + + + + + + + + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + // v v + Second: 0b0100000000000000000000001000000000000000000000000000000000000000, + Expected: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + + + + + + + + + + { + // v v + First: 0b0000000000000000000000000100000000000000000000000000000000000001, + // v v + Second: 0b0000000000000000000000000000000000000000100000000000000000000001, + Expected: 0b0100000000000000000000000000000000000001100000000000000000000001, + // ^ ^^ ^ + }, + + + + + + + + + + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111011111111111111111111111, + Expected: 0b0000000000000000000000000000000000000000011111111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111101111111111111111111111, + Expected: 0b0000000000000000000000000000000000000000101111111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111110111111111111111111111, + Expected: 0b0000000000000000000000000000000000000000110111111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111011111111111111111111, + Expected: 0b0000000000000000000000000000000000000000111011111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111101111111111111111111, + Expected: 0b0000000000000000000000000000000000000000111101111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111110111111111111111111, + Expected: 0b0000000000000000000000000000000000000000111110111111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111011111111111111111, + Expected: 0b0000000000000000000000000000000000000000111111011111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111101111111111111111, + Expected: 0b0000000000000000000000000000000000000000111111101111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111110111111111111111, + Expected: 0b0000000000000000000000000000000000000000111111110111111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111011111111111111, + Expected: 0b0000000000000000000000000000000000000000111111111011111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111101111111111111, + Expected: 0b0000000000000000000000000000000000000000111111111101111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111110111111111111, + Expected: 0b0000000000000000000000000000000000000000111111111110111111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111011111111111, + Expected: 0b0000000000000000000000000000000000000000111111111111011111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111101111111111, + Expected: 0b0000000000000000000000000000000000000000111111111111101111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111110111111111, + Expected: 0b0000000000000000000000000000000000000000111111111111110111111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111011111111, + Expected: 0b0000000000000000000000000000000000000000111111111111111011111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111101111111, + Expected: 0b0000000000000000000000000000000000000000111111111111111101111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111110111111, + Expected: 0b0000000000000000000000000000000000000000111111111111111110111111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111011111, + Expected: 0b0000000000000000000000000000000000000000111111111111111111011111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111101111, + Expected: 0b0000000000000000000000000000000000000000111111111111111111101111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111110111, + Expected: 0b0000000000000000000000000000000000000000111111111111111111110111, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111111011, + Expected: 0b0000000000000000000000000000000000000000111111111111111111111011, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111111101, + Expected: 0b0000000000000000000000000000000000000000111111111111111111111101, + }, + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111111110, + Expected: 0b0000000000000000000000000000000000000000111111111111111111111110, + }, + + + + { + First: 0b0000000000000000000000000000000000000000000000000000000000000000, + Second: 0b0111111111111111111111111111111111111111111111111111111111111111, + Expected: 0b0000000000000000000000000000000000000000111111111111111111111111, + }, + + + + { + First: 0b0000000000000000000000000111111111111111111111111111111111111111, + Second: 0b0000000000000000000000000000000000000000000000000000000000000000, + Expected: 0b0111111111111111111111111111111111111111000000000000000000000000, + }, + } + + for testNumber, test := range tests { + + var actual uint64 = compile(test.First, test.Second) + if expected := test.Expected; expected != actual { + t.Errorf("For test #%d, the actual compiled result if not what was expected.", testNumber) + t.Logf("FIRST: %064b", test.First) + t.Logf("SECOND: %064b", test.Second) + t.Logf("EXPECTED: %064b", expected) + t.Logf("ACTUAL: %064b", actual) + continue + } + } +} diff --git a/decompile_test.go b/decompile_test.go new file mode 100644 index 0000000..95b6bb1 --- /dev/null +++ b/decompile_test.go @@ -0,0 +1,442 @@ +package iid + +import ( + "testing" +) + +func TestDecompile(t *testing.T) { + + tests := []struct{ + Value uint64 + }{ + { + Value: 0b0000000000000000000000000000000000000000000000000000000000000000, + }, + + + + { + Value: 0b0000000000000000000000000000000000000000000000000000000000000001, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000000000010, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000000000100, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000000001000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000000010000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000000100000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000001000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000010000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000000100000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000001000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000010000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000000100000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000001000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000010000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000000100000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000001000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000010000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000000100000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000001000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000010000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000000100000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000001000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000010000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000000100000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000001000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000010000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000000100000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000001000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000010000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000000100000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000001000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000010000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000000100000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000001000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000010000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000000100000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000001000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000010000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000000100000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000001000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000010000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000000100000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000001000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000010000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000000100000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000001000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000010000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000000100000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000001000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000010000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000000100000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000001000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000010000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000000100000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000001000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000010000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000000100000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000001000000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000010000000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0000100000000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0001000000000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0010000000000000000000000000000000000000000000000000000000000000, + }, + { + Value: 0b0100000000000000000000000000000000000000000000000000000000000000, + }, + + + + + { + Value: 0b0111111111111111111111111111111111111111111111111111111111111110, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111111111101, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111111111011, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111111110111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111111101111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111111011111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111110111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111101111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111111011111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111110111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111101111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111111011111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111110111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111101111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111111011111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111110111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111101111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111111011111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111110111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111101111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111111011111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111110111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111101111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111111011111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111110111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111101111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111111011111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111110111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111101111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111111011111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111110111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111101111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111111011111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111110111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111101111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111111011111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111110111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111101111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111111011111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111110111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111101111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111111011111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111110111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111101111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111111011111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111110111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111101111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111111011111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111110111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111101111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111111011111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111110111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111101111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111111011111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111110111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111101111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111111011111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111110111111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111101111111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0111011111111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0110111111111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0101111111111111111111111111111111111111111111111111111111111111, + }, + { + Value: 0b0011111111111111111111111111111111111111111111111111111111111111, + }, + + + + { + Value: 0b0111111111111111111111111111111111111111111111111111111111111111, + }, + + + + + { + Value: 0b0000000000000000000000000000000000000000100000000000000000000001, + }, + + + + { + Value: 0b0100000000000000000000000000000000000001000000000000000000000000, + }, + + + + { + Value: 0b0100000000000000000000000000000000000001100000000000000000000001, + }, + } + + for testNumber, test := range tests { + + first, second := decompile(test.Value) + + actual := compile(first, second) + + if expected := test.Value; expected != actual { + t.Errorf("For test #%d, the actual re-compiled value of the decompiled values is not what was expected.", testNumber) + t.Logf("EXPECTED: %064b", expected) + t.Logf("ACTUAL: %064b", actual) + t.Logf("FIRST %064b", first) + t.Logf("SECOND %064b", second) + continue + } + } +}