このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/300
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):符号無し整数x を右にn ビット回転した値を返す関 
#  数rrotate と,左にn ビット回転した値を返す関数 
#  lrotate 
#  unsigned rrotate(unsigned x, int n) 
#  unsigned lrotate(unsigned x, int n) 
#  を作成せよ 
#  *関数はprint_bits 関数を利用すること 
#   
#   
#  <実行例> 
#  非負の整数を入力してください:34567 
#  何ビット回転しますか:4 
#  回転前= 1000011100000111 
#  右回転= 0111100001110000 
#  左回転= 0111000001111000 
#  

'符号無し整数xを右にnビット回転した値と,左にnビット回転した値'(_x,_n,_右にnビット回転した値,_左にnビット回転した値) :-
        十進数を二進ならびに変換(_n,_二進ならび),
        右にnビット回転した値と(_n,_二進ならび,_右にnビット回転した値),
        左にnビット回転した値と(_n,_二進ならび,_左にnビット回転した値).

十進数を二進ならびに変換(_十進数,_二進ならび) :-
        十進数を二進ならびに変換(_十進数,[],_二進ならび).

十進数を二進ならびに変換(0,X,X) :- !.
十進数を二進ならびに変換(N,L1,L) :-
        B is N mod 2,
        N_1 is N // 2,
        十進数を二進ならびに変換(N_1,[B|L1],L).

右にnビット回転した値と(_n,_二進ならび,_右にnビット回転した値) :-
        ならびをn要素右に回転する(_二進ならび,_n,_右にnビット回転した二進ならび),
        二進ならびを十進数に変換(_右にnビット回転した二進ならび,_右にnビット回転した値).

左にnビット回転した値と(_n,_二進ならび,_左にnビット回転した値) :-
        ならびをn要素左に回転する(_二進ならび,_n,_左にnビット回転した二進ならび),
        二進ならびを十進数に変換(_左にnビット回転した二進ならび,_左にnビット回転した値).

ならびをn要素右に回転する(L1,_n,L2) :-
        length(R,_n),
        append(L0,R,L1),
        append(R,L0,L2).

ならびをn要素左に回転する(L1,_n,L2) :-
        length(L0,_n),
        append(L0,R,L1),
        append(R,L0,L2).

二進ならびを十進数に変換(_二進ならび,_十進数) :-
        二進ならびを十進数に変換(_二進ならび,0,_十進数).

二進ならびを十進数に変換([],N,N) :- !.
二進ならびを十進数に変換([B|R],N1,N) :-
        N2 is 2 * N1 + B,
        二進ならびを十進数に変換(R,N2,N).