Quick actions

cmd+k|ctrl+k

Navigation

Languages

Int Code to BitFlag

Snippet info

Language

Csharp

Visibility

public

Author

isobit

Created

2018-03-13T15:38:55Z

Updated

2018-03-14T18:39:57Z

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;
            }
        }
    }
}
INFO