初級A
課題1 進数変換
1-1.
10進数の31を2進数に変換しなさい。下のヒントを見て手計算で行うか、Processingを用いてもよい。余りを求める演算子は%です。
1-2.
また2進数の10111を10進数に変換しなさい。下のヒントを参考にすること。計算にProcessingを用いる場合、2のn乗はpow(2, n)で計算できます。
[ヒント]
10進数の26を2進数に変換する方法を説明します。
ステップ1: 2で割り続ける
最初に、10進数の26を2で割ります。商を次のステップに持ち越し、余りを保持します。
26 ÷ 2 = 13 … 0
ステップ2: 商を2で割り続ける
次に、ステップ1で求めた商である13を2で割ります。
13 ÷ 2 = 6 … 1
ステップ3: 再び商を2で割り続ける
次に、ステップ2で求めた商である6を2で割ります。
6 ÷ 2 = 3 … 0
ステップ4: 再び商を2で割り続ける
次に、ステップ3で求めた商である3を2で割ります。
3 ÷ 2 = 1 … 1
ステップ5: 最後の商を計算する
最後に、ステップ4で求めた商である1を2で割ります。
1 ÷ 2 = 0 … 1
ステップ6: 余りを逆順に並べる
ステップ1からステップ5までの計算結果の余りを逆順に並べると、2進数の表現が得られます。
26の2進数表現: 11010
以上が、10進数の26を2進数に変換する方法です。
[ヒント]
次に2進数の11010を10進数に変換する方法を説明します。
ステップ1: 2進数の桁の重みを計算する
2進数では、右端の桁から順に2のべき乗の重みを持ちます。右端の桁から順に、2^0, 2^1, 2^2, 2^3, 2^4 のように増えていきます。2^4は2の4乗を意味します。
桁の位置: 4 3 2 1 0
桁の重み: 16 8 4 2 1
ステップ2: 桁の重みと2進数の対応する桁を掛け合わせる
各桁の重みと2進数の対応する桁の値を掛け合わせ、合計を計算します。
1 * 16 = 16
1 * 8 = 8
0 * 4 = 0
1 * 2 = 2
0 * 1 = 0
ステップ3: 合計を計算する
ステップ2で計算した値を合計します。
16 + 8 + 0 + 2 + 0 = 26
以上が、2進数の11010を10進数に変換する方法です。結果として、2進数の11010は10進数の26になります。
課題2 負の数の表現
コンピュータでは計算に2進数を用いていますが、負の数を表現する場合、補数と呼ばれる数を利用します。
例えば4ビット(2進数4桁)の世界で考えます。
2進数0101に補数1011を足すと10000になります。
ところが4ビットの世界で考えているので最初の1は無視します。すなわち0000となります。
足して0になるということは補数1011は負の数-0101を表していると言えます。
このようにある自然数に対して足すと1桁増える最も小さな数を補数といいます。
2進数の補数は次のように求めることができます。
各桁の0と1を反転する。そして1を足す。
例えば0101を反転すると1010
1を足すと
1011となりこれが補数です。
それでは
1001の負の数-1001を2進数4桁で求めなさい。1001の補数を求めるということです。
課題3 XOR
排他的論理和XORを計算するProcessingのプログラムを作成しなさい。
[ヒント]
boolean演算子を組み合わせます。
XORは片方だけがTrueのときTrue、両方同じ値のときFalseになる演算子です。
boolean a, b, xor;
void setup() {
a = true;
b = true;
xor = ;
println(xor);
}
課題4 日付
日付(today=20270427)が与えられたときに年(year=2027)、月(month=4)、日(day=27)を求めて表示するプログラムを作成しなさい。
[ヒント]
int today = 20270427を整数10000で割ると小数点以下は切り捨てられて2027となります。
課題5 FizzBuzz問題
有名なFizzBuzz問題です。以下のルールに従いforループとif文を使ってProcessingのプログラムを作成すること。
1から100まで順に数を数え上げていき、3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数(15の倍数)なら「Fizz Buzz」、そのいずれでもなければその数をprintlnで表示しなさい。