補数について考えてみましょう.教科書 p.129(旧版では p.127)で説明があるのですが,補数とは何かから考えます.まず,皆さんは繰り上がりのある足し算について特に問題なくできると思いますが,それは10の補数を暗算で求めているからです.
整数 4 に対する 10 の補数は 6: 4 + 6 = 10 整数 m に対する 10 の補数 n は n = 10 - m で求められる |
2進数では足すと桁が1つ増える最小の数を2の補数といいます.もちろん上の考え方でも補数を求めることは可能です.しかし, Web テキストでも説明したように,ビット演算は通常の演算よりも高速で行われるため,ビット演算子を活用することが望ましいとされています.
0101 の 2 の補数は 1011 (一番左の 23 の桁が 0 でも桁としてカウントしていることに注意) 10000 - 0101 = 1011 (10進数では 16 - 5 = 11) 24 = 16 であることもご存じのとおり |
わかりにくいのは1の補数の方で,こちらは足しても桁が繰り上がらない最大の数ということになっています.
さて,問題です.5から8までの整数を1つ乱数を用いて発生させ,その桁数の2進数を一つ乱数で発生させます.そして,その数の1の補数と2の補数を求めるプログラムを作成しましょう.
Student number: s236099 Number of digits in binary and max in decimal: 7, 127 Base number: 0001011 -- 11 One's complement: 1110100 -- 116 Two's complement: 1110101 -- 117 ------------------------ |
教科書 p.127(旧版では p.125)の List 5-7 と教科書 p.129(旧版では p.127)の Column 5-3 を参考にしてください.
解答用紙を使用する際には,学生番号と名前の記入も忘れないでください.さらに,解答用紙自体がPythonのプログラムとなっていますので,実行してエラーの無いことを確認してから提出してください. 指定の解答用紙を使用していない,実行時にエラーが出る,学生番号と名前が無い,というような答案は提出されても採点しません.注意してください. |
解答例
# ############################# # # プログラミング入門I 宿題 2023.12.25 # 学生番号: s236099 # 氏名: 松江 花子 # # ############################# import random print('Student number: s236099') print('') digit = random.randint(5, 8) m = 2 ** digit - 1 num = random.randint(0, 2 ** digit - 1) print(f'Number of digits in binary and max in decimal: {digit}, {m}') print(f'Base number: {num:0{digit}b} -- {num:3}') print(f'One\'s complement: {~num & m:0{digit}b} -- {~num & m:3}') print(f'Two\'s complement: {~num + 1 & m:0{digit}b} -- {~num + 1 & m:3}') print('\n------------------------\n') |