using System;
using System.Collections.Generic;
class MainClass {
public static ulong CodeToBitFlag(int code) {
//if (code < 0 || code >= 60)
//throw new ArgumentOutOfRangeException("code", "Codes must be between 1 and 59 to avoid overflow problems problems converting to doubles.");
return 1UL << (code - 1);
}
public static List<int> BitFlagToCodes(ulong flag) {
var codes = new List<int>();
var i = 1;
while (flag > 0) {
if ((flag & 1) == 1)
codes.Add(i);
i += 1;
flag = flag >> 1;
}
return codes;
}
static void Main() {
Console.WriteLine(CodeToBitFlag(1));
Console.WriteLine(CodeToBitFlag(2));
Console.WriteLine(CodeToBitFlag(3));
Console.WriteLine(CodeToBitFlag(4));
Console.WriteLine(CodeToBitFlag(5));
Console.WriteLine("--------------------------");
Console.WriteLine(String.Join(",", BitFlagToCodes(1)));
Console.WriteLine(String.Join(",", BitFlagToCodes(2)));
Console.WriteLine(String.Join(",", BitFlagToCodes(4)));
Console.WriteLine(String.Join(",", BitFlagToCodes(8)));
Console.WriteLine("--------------------------");
Console.WriteLine(String.Join(",", BitFlagToCodes(3)));
Console.WriteLine(String.Join(",", BitFlagToCodes(5)));
Console.WriteLine(String.Join(",", BitFlagToCodes(4 | 8)));
Console.WriteLine(String.Join(",", BitFlagToCodes(CodeToBitFlag(3) | CodeToBitFlag(10))));
Console.WriteLine("--------------------------");
Console.WriteLine(String.Join(",", BitFlagToCodes((ulong)((double)(CodeToBitFlag(20) | CodeToBitFlag(41))))));
Console.WriteLine("--------------------------");
for (var i = 2; i < 100; i++) {
ulong f0 = CodeToBitFlag(i-1);
ulong f = CodeToBitFlag(i);
double d = (double)f;
ulong fd = (ulong)d;
if (f != fd) {
Console.WriteLine($"Double mismatch at i={i}; d={d}, f={f}, fd={fd}");
break;
}
if (f < f0) {
Console.WriteLine($"Overflow at i={i}; d={d}, f={f}, fd={fd}");
break;
}
}
for (ulong l = 1UL << 60; l > 1; l++) {
double d = (double)l;
ulong ld = (ulong)d;
if (l != ld) {
var flags = String.Join(",", BitFlagToCodes(l));
Console.WriteLine($"Double mismatch: l={l}, d={d}, ld={ld}, flags={flags}");
break;
}
}
}
}