このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/887
#  (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 
#  実行結果: 
#  数値f0f0のビット状態 
#  1111000011110000 
#  3ビット回転させました 
#  数値8787のビット状態 
#  1000011110000111 
#  ベース 
#  #include <stdio.h> 
#  void print_bit(unsigned short int x); //プロトタイプ宣言 
#  int main(){ 
#      unsigned short int usi; 
#      usi = 0xf0f0 ; 
#      print_bit(usi); 
#      return 0;  //システムに値0を返す 
#  } 
#  void print_bit(unsigned short int x){ 
#      int length , i , mask ; 
#      mask = 1; 
#      length = sizeof(x) *8; 
#      mask =mask << (length -1); 
#      printf("数値%xのビット状態\n",x); 
#      for(i = 1;i<= length ; i++){ 
#          if(x & mask){ 
#              printf("1"); 
#          }else{ 
#              printf("0"); 
#          } 
#          mask =mask >> 1; 
#      } 
#      printf("\n"); 
#  } 
# 
#  

'2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :-
        'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび),
        '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!.

'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :-
        数2進数変換(_数,_2進数ならび),
        ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび).

'数2進数変換'(_数,_2進数ならび) :-
'数2進数変換'(_数,[],_2進数ならび).

'数2進数変換'(0,_2進数ならび,_2進数ならび).
'数2進数変換'(N,L,_2進数ならび) :-
'数2進数変換して行く'(N,L,_2進数ならび).

'数2進数変換して行く'(N,L,_2進数ならび) :-
        M is N mod 2,
        N_1 is N // 2,
        '数2進数変換'(N_1,[M|L],_2進数ならび).

'2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :-
        '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示),
        それを16進数と2進数で表示する(_Nビット回転,L,_2進表示).

'2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :-
        ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L),
        atomic_list_concat(L,_2進表示).

ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :-
        length(_2進数ならび,_桁),
        _0を付加するべき数 is _ベース桁数 - _桁,
        頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび).

頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび).
頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :-
        N \== 0,
        'N桁の0ならび'(N,_N桁の0ならび),
        append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび).

'N桁の0ならび'(N,_N桁の0ならび) :-
        length(_N桁の0ならび,N),
        all(_N桁の0ならび,0).

all([],_).
all([N|R],N) :-
        all(R,N).

ならびの左回転(N,N,[A|R],L) :-
        append(R,[A],L),!.
ならびの左回転(M,N,[A|R],L) :-
        append(R,[A],L1),
        M2 is M + 1,
        ならびの左回転(M2,N,L1,L).

それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :-
        writef('%wビット回転しました\n数値 ',[_Nビット回転]),
        '16進数で表示する'(L),
        '2進数で表示する'(_2進表示).

'16進数で表示する'(_2進ならび) :-
        '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび),
        '2進数16進数表示'(_整形された2進ならび).

'桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :-
        length(_2進ならび,_桁),
        _余り is _桁 mod 4,
        '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび).

'頭部に0を付加する'(0,L,L).
'頭部に0を付加する'(1,L,[0,0,0|L]).
'頭部に0を付加する'(2,L,[0,0|L]).
'頭部に0を付加する'(3,L,[0|L]).

'2進数で表示する'(_2進表示) :-
        write('のビット状態\n'),
        writef('%w\n',[_2進表示]).

'2進数16進数表示'([]) :-
        write('\n'),!.
'2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :-
        '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記),
        writef('%w',[_16進表記]),
        '2進数16進数表示'(R).

'4ビット数ならび16進表記'([0,0,0,0],'0').
'4ビット数ならび16進表記'([0,0,0,1],'1').
'4ビット数ならび16進表記'([0,0,1,0],'2').
'4ビット数ならび16進表記'([0,0,1,1],'3').
'4ビット数ならび16進表記'([0,1,0,0],'4').
'4ビット数ならび16進表記'([0,1,0,1],'5').
'4ビット数ならび16進表記'([0,1,1,0],'6').
'4ビット数ならび16進表記'([0,1,1,1],'7').
'4ビット数ならび16進表記'([1,0,0,0],'8').
'4ビット数ならび16進表記'([1,0,0,1],'9').
'4ビット数ならび16進表記'([1,0,1,0],'a').
'4ビット数ならび16進表記'([1,0,1,1],'b').
'4ビット数ならび16進表記'([1,1,0,0],'c').
'4ビット数ならび16進表記'([1,1,0,1],'d').
'4ビット数ならび16進表記'([1,1,1,0],'e').
'4ビット数ならび16進表記'([1,1,1,1],'f').