このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1255709298/326
#  [1] 授業単元:C言語とアルゴリズム 
#  [2] 問題文: http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10008.txt
# ●問題1−1 反復型処理(ビット列の表示)
#  符号なし32bit整数を入力して、その数を2進表示するプログラムを作成しなさい。
# さらに0のビットと1のビットの数を教示しなさい。ただし、2進表示は実行例のように4桁ずつ区切ること。
# 
# [実行例]
# 符号なし32bit整数を入力してください.
# 987654321
# 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 です.
# 0のビット数は15,1のビット数は17です.
# 
# ●問題1−2 
#  符号なし32bit整数を2つ入力して、それらを2進表示するプログラムを作成しなさい。
# さらに、実行例のようにビット反転(1の補数表示〜),ビットシフト(<<, >>), ビット論理積(&),ビット論理和(|),
# ビット排他的論理和(^)を表示しなさい。ただし2進表示は4桁ずつ区切ること.
# また問題1−1で作成した2進表示の関数を再利用すること。
# 
# [実行例]
# 符号なし32bit整数2つを入力してください.
# 987654321 123456789
# 987654321 は2進表示で 0011 1010 1101 1110 0110 1000 1011 0001 ,
# 123456789 は2進表示で 0000 0111 0101 1011 1100 1101 0001 0101 です.
# 〜987654321 は2進表示で 1100 0101 0010 0001 10010111 0100 1110 ,
# 〜123456789 は2進表示で 1111 1000 1010 0100 0011 0010 1110 1010 です.
# 987654321 << 1は2進表示で 0111 0101 1011 1100 1101 0001 0110 0010 ,
# 123456789 >> 1は2進表示で 0000 0011 1010 1101 1110 0110 1000 1010 です.
# 987654321 & 123456879 は2進表示で 0000 0010 0101 1010 0100 1000 0001 0001 です.
# 987654321 | 123456879 は2進表示で 0011 1111 1101 1111 1110 1101 1011 0101 です.
# 987654321 ^ 123456879 は2進表示で 0011 1101 1000 0101 1010 0101 1010 0100 です.

符号なし32bit整数を入力して、その数を2進表示する(_10進数) :-
    二進数(_10進数,L),
    '4文字区切り'(L,S),
    findsum(1,member(0,L),S0),
    findsum(1,member(1,L),S1),
    write_formatted('%t は2進表示で %t です\n0のビット数は%t,1のビット数は%tです.\n',[_10進数,S,S0,S1]).

符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :-
    二進数(_10進数_1,L_1),
    二進数(_10進数_2,L_2),
    ビットの論理和(L_1,L_2,L_3),
    '4文字区切り'(L_3,S),
    write_formatted('%t は2進表示で %t ,\n%t は2進表示で %t です.\n',[_10進数_1,S_1,_10進数_2,S_2]).

ビットを反転して表示(_10進数) :-
    二進数(_10進数,L),
    ビットの反転(L,L1),
    '4文字区切り'(L1,S),
    write_formatted('〜%t は2進表示で %t です.\n',[_10進数,S]).

ビットを左シフトして表示(_10進数,_シフト数) :-
    二進数(_10進数,L),
    ビットの左シフト(_シフト数,L,L1),
    '4文字区切り'(L1,S),
    write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]).

ビットを右シフトして表示(_10進数,_シフト数) :-
    二進数(_10進数,L),
    ビットの右シフト(_シフト数,L,L1),
    '4文字区切り'(L1,S),
    write_formatted('%t >> %t は2進表示で %t です.\n',[_10進数,_シフト数,S]).

符号なし32bit整数を2つ入力して、論理和を2進表示する(_10進数_1,_10進数_2) :-
    二進数(_10進数_1,L_1),
    二進数(_10進数_2,L_2),
    ビットの論理和(L_1,L_2,L_3),
    '4文字区切り'(L_3,S),
    write_formatted('%t | %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]).

符号なし32bit整数を2つ入力して、論理積を2進表示する(_10進数_1,_10進数_2) :-
    二進数(_10進数_1,L_1),
    二進数(_10進数_2,L_2),
    ビットの論理積(L_1,L_2,L_3),
    '4文字区切り'(L_3,S),
    write_formatted('%t & %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]).

符号なし32bit整数を2つ入力して、排他的論理和を2進表示する(_10進数_1,_10進数_2) :-
    二進数(_10進数_1,L_1),
    二進数(_10進数_2,L_2),
    ビットの排他的論理和(L_1,L_2,L_3),
    '4文字区切り'(L_3,S),
    write_formatted('%t ^ %t は2進表示で %t です.\n',[_10進数_1,_10進数_2,S]).

ビットの反転([],[]).
ビットの反転([0|R1],[1|R2]) :- ビットの反転(R1,R2).
ビットの反転([1|R1],[0|R2]) :- ビットの反転(R1,R2).

ビットの右回転(_シフト数,_ビットならび,_シフトしたビットならび) :-
    ならびの回転(右方向,_シフト数,_ビットならび,_シフトしたビットならび).

ビットの左回転(_シフト数,_ビットならび,_シフトしたビットならび) :-
    ならびの回転(左方向,_シフト数,_ビットならび,_シフトしたビットならび).

ビットの左シフト(_シフト数,_ビットならび,_シフトしたビットならび) :-
    length(L1,_シフト数),
    length(L2,_シフト数),
    all(L2,0),
    append(L1,L3,_ビットならび),
    append(L3,L2,_シフトしたビットならび).

ビットの右シフト(_シフト数,_ビットならび,_シフトしたビットならび) :-
    length(L1,_シフト数),
    length(L2,_シフト数),
    all(L2,0),
    append(L3,L1,_ビットならび),
    append(L2,L3,_シフトしたビットならび).

ビットの論理和([],[],[]).
ビットの論理和([0|R1],[0|R2],[0|R3]) :- ビットの論理和(R1,R2,R3).
ビットの論理和([1|R1],[0|R2],[1|R3]) :- ビットの論理和(R1,R2,R3).
ビットの論理和([0|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3).
ビットの論理和([1|R1],[1|R2],[1|R3]) :- ビットの論理和(R1,R2,R3).

ビットの論理積([],[],[]).
ビットの論理積([0|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3).
ビットの論理積([1|R1],[0|R2],[0|R3]) :- ビットの論理積(R1,R2,R3).
ビットの論理積([0|R1],[1|R2],[0|R3]) :- ビットの論理積(R1,R2,R3).
ビットの論理積([1|R1],[1|R2],[1|R3]) :- ビットの論理積(R1,R2,R3).

ビットの排他的論理和([],[],[]).
ビットの排他的論理和([0|R1],[0|R2],[0|R3]) :- ビットの排他的論理和(R1,R2,R3).
ビットの排他的論理和([1|R1],[0|R2],[1|R3]) :- ビットの排他的論理和(R1,R2,R3).
ビットの排他的論理和([0|R1],[1|R2],[1|R3]) :- ビットの排他的論理和(R1,R2,R3).
ビットの排他的論理和([1|R1],[1|R2],[0|R3]) :- ビットの排他的論理和(R1,R2,R3).

二進数(_10進数,L) :-
    length(L,32),
    二進数(_10進数,[],X),
    append(L1,X,L),
    all(L1,0).

二進数(J,Y,[J|Y]) :- J < 2.
二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X).


'4文字区切り'([],'').
'4文字区切り'([A,B,C,D|R],S) :-
    '4文字区切り'(R,S1),
    concat_atom([A,B,C,D,' ',S1],S).