中国将棋の将帥問題と位域


「中国将棋将帥問題」を見た友達は知っていますが、この問題の秘密は「1バイトしか変数を記憶できない」ことにあります.変数の個数は規定されていませんので、このバイトの処理はこの問題のプログラミングの美しさを構成しています.
この三つのアルゴリズムはそれぞれ特色があります.ここでは一つ一つ列挙しません.このブログを書くのは主にみんなと第三のアルゴリズムの関連知識を共有したいです.
第三のアルゴリズムのコード主体:
struct {
    unsigned char a:4;
    unsigned char b:4;
} i;

for (i.a = 1; i.a <= 9; i.a++) 
    for (i.b = 1; i.b <= 9; i.b++)
        if (i.a % 3 != i.b % 3)
            printf ("A = %d, B = %d
", i.a, i.b);
ここを見ると、彼はビットドメイン構造体を使っています.マイクロソフトのテーマの中で、ビットドメインは決して珍しいものではありません.
いくつかの場合、私たちが使用している変数はバイト全体を占用しなくてもいいです.数ビットが必要であれば、ビット領域を使ってみてもいいです.以下はビット領域に関するいくつかのルールです.
  • は、隣接するビット領域フィールドのタイプが同じであり、そのタイプの幅よりもビット幅が小さい場合、後のフィールドは、タイプ幅を超えるまで前のフィールドに連続して格納される.
  • は、隣接するビット領域フィールドのタイプが同じであるが、ビット幅の和がこのタイプより大きい場合、超えた部分は新しいアドレスユニットから格納される.
  • 隣接ビットフィールドのタイプが異なる場合、処理モードは異なるコンパイラによって異なる表現を有する.
  • ビット分域フィールドの中間に非ビット分域フィールドがある場合、連続的に隣接するビット分域フィールドから圧縮が開始される.
  • 圧縮されたサイズは、このタイプの幅の整数倍である.
  • 名前が付いていないビット領域は空格子点領域であり、自動的に0で充填され、調整位置としてしか使用できず、データを格納できない.
  • データを連続的に保存し、低いから高いまでの原則に従い、低い位置に充填してから高い位置に充填する.
  • 例:
    struct {
           unsigned char a:4;//        b,   , sizeof(int)=4  (     “    ”  )
           unsigned int b;   // 4  
           unsigned char c:4;
           unsigned char d:4; 
           unsigned char e:4; 
           unsigned char f:4;
           unsigned char g:4;//c,d,e,f,g       ,    ,    ,   20bits,    , 4  。
           } i;//  sizeof(i)=12
    ここで注意するのは、cではなく、dはcharのサイズを充填した後、1つのcharとしてintに整列するのではなく、c、d、e、f、g全体として、intに配置される.