見出し画像

Swiftでアプリ。- 作ってみよう。 while文

詳解Swiftより例題で出されているものをちょっと考えながら書いて実行して理解を深めます。

while文

整数のビット数を求めます。

ビットとは

ビットとは、情報量の最小単位で、二つの選択肢から一つを特定する情報の量。語源は “binary digit” (二進法の数字)と言われ、コンピュータなどでは0と1のいずれかを取る二進数の一桁として表される。情報をすべてビット列に置き換えて扱うことを「デジタル」(digial)という。

https://e-words.jp/w/%E3%83%93%E3%83%83%E3%83%88.html

ということで、

let val = 10032

var i = 1,mask = 2

while mask <= val{
  mask <<= 1
    i += 1
}

print(i) // 14
print(mask)  // 16384

これを実行すると"14"と出てきます。maskは16384となっています。

2進数で14桁で表現できるということになりました。ループ自体は13回ですが、最初の時点で"2"を使っていて初期値を"1"としているので14となります。

"i"には何回ループしたかを記録する数字を入れます。あとは変数maskに初期値2が入っているので

mask <<= 1

で1ビットずらしていきmaskがvalに代入されている10032を超えるまでwhileループさせます。条件が成り立たなくなった時点でループを抜けるのでその時の"i"の値がビットの数、2進数の桁すうとなります。

13回ループした時点で"16384"となっているので次に、10032と比べた時点では条件が合わないのでループを抜けます。

while文では最初に条件をクリアしないと1回も処理しません。


repeat-while文

コラッツの問題のプログラムです。

任意の正の整数n が偶数の場合、n を 2 で割る、n が奇数の場合、n に 3 をかけて 1 を足す。このとき、「どんな初期値から始めても、有限回の操作のうちに必ず 1 に到達する(そして 1→4→2→1 というループに入る)」

var n = 7

repeat{
    print("\(n) ", terminator:"")
    if n % 2 == 0{
        n /= 2
    }else{
        n = n * 3 + 1
    }
}while n > 1

print(n)  // 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

repeat-while文では最初の1回目の処理をしてから"while"で条件をチェックします。なので1回は必ず処理するところがwhile文とは違うところです。

まず以下で改行しないで"n"を出力するようにしています。

print("\(n) ", terminator:"")

次に

if n % 2 == 0{
  n /= 2
}else{
  n = n * 3 + 1
}

偶数の場合、奇数の場合の処理をしています。

この操作を

while n > 1

"n"が"1"以上の場合に繰り返します。

この記事が気に入ったらサポートをしてみませんか?