0x03F566ED27179461ULLの求め方


これ凄いですね。まだC言語勉強し始めて良く分からない部分も多いですが、なんとなくイメージは付きました。

0x03F566ED27179461ULLは6ビットのパターンが全部網羅されている数値になるわけですが、これを求めるための処理を勉強がてら書いてみました。

#include <stdio.h>

typedef unsigned long long u64;

int main (void) {
    u64 table[64] = {0};
    u64 i = 120UL;
    u64 j;
    int flag = 1;
    
    for(j=288230376151711744ULL;j<18302628885633695744ULL;j++) {
        flag = 1;
        for(i=0;i<64;i++){
            int index = (j<<i) >> 58;
            if ( table[index] == j ) {
                flag = 0;
                break;
            }
            table[index] = j;
        }
        if ( flag ) {
            // 見つけた!
            printf("%lld\n",j);
        }
    }
    
    printf("end\n");
    
    return 0;
}

単純に0000010000000000000000000000000000000000000000000000000000000000から1111111000000000000000000000000000000000000000000000000000000000までの数値をループして計算してます。

実装してみたものの、恐ろしくて実行はできませんでした(笑)

実際もっとうまい方法はあるんだろうか。6ビットのパターンが64通りなので全組み合わせを検証しようと思ったら64の階乗になるのかな?

64の階乗て・・・。天文学的数値だよ。

ちなみに0x03F566ED27179461ULLの値から±1億くらいの範囲でループして確認したところ、同じように6ビット網羅してる数値をいくつか発見しました。

3F566ED2138BCA3
3F566ED213945E3
3F566ED2139462F
3F566ED213978A3
3F566ED2144E5E3
3F566ED2146272F
3F566ED21789CA3
3F566ED217944E3
3F566ED21794627
3F566ED227185E5
3F566ED227285E3
3F566ED2272F185
3F566ED2284E5E3
3F566ED22F184E5
3F566ED22F284E3
3F566ED2309C5E5
3F566ED2309CBC5
3F566ED230BC4E5
3F566ED231385E5
3F566ED2313942F
3F566ED23139785
3F566ED2314272F
3F566ED231784E5
3F566ED23179427
3F566ED2708C5E5
3F566ED270BCA31
3F566ED2710BCA3
3F566ED271185E5
3F566ED27179423
3F566ED27179461
3F566ED271845E5
3F566ED27185E51
3F566ED272845E3
3F566ED2728462F
3F566ED27285E23
3F566ED272885E3
3F566ED2728BC61
3F566ED2728C2F1
3F566ED2728C42F
3F566ED2728C5E1
3F566ED272F08C5
3F566ED272F0A31
3F566ED272F10A3
3F566ED272F1185
3F566ED272F1423
3F566ED272F1461
3F566ED272F1845
3F566ED272F1851
3F566ED2845E4E3
3F566ED28462F27
3F566ED284E2F23
3F566ED284E45E3
3F566ED284E462F
3F566ED285E2723
3F566ED285E44E3
3F566ED285E4627
3F566ED285E4E23
3F566ED2885E4E3
3F566ED289C6179
3F566ED289C85E3
3F566ED28BC6139
3F566ED28BC84E3
3F566ED28BC9C61
3F566ED28C27179
3F566ED28C2F139
3F566ED28C2F271
3F566ED28C42F27
3F566ED28C4E179
3F566ED28C4E42F
3F566ED28C5E139
3F566ED28C5E427
3F566ED28C5E4E1


まさしく「でっていう」ですね。