構造化プログラミング、n進数

6月も第2週に突入〜。
昨日は真夏のような暑さでしたが、今日はなんだか寒かったです。
天気もあまり良くないようで、梅雨が始まりつつあるのかなぁと感じております。
今年もどこかに、紫陽花でも見に行こうか考え中です。

本日のメニュー
■構造化プログラミング
■n進数



■構造化プログラミング
□構造化
可読性が高い→読みやすい、インデント、スペース、改行など人が読みやすいかどうか
保守性が高い→他の人にもやれるか、メンテしやすいか、変更を加えてバグが起きないか
繰り返しが少ない→同じこと繰り返してないか

□関数化の手順
1、名前の定義
 目的に沿っているか
2、引数(IN)の確認
 必要性の確認
3、戻り値(OUT)の確認
 目的を満たしているか

□実際にどうやってやっていくか
1、共通部分を探す
•繰り返し
•他でも使えそうなところ
→functionにしてみる
※functionにできるかどうかの見極め
(functionは戻り値が1個だけ、ということに注目)

本日はここまで…。



■n進数
□n進数とは
n進数とは、各桁にn種類の数字(文字)を用いる数の形式。
※10、2、16、8進数などがある。

□なぜ2進数が使われるか
2値の表現の「0」[1」は、電圧の高い低いという電気信号に容易に置き換えられる。
雑音や外的環境の変動に対してもっとも影響を受けにくい。



□2進数から10進数
1001 →2×1+2×0+2×0+2×1
 →9

□16進数から10進数
FE →16×15+16×14
→254

□10進数から2進数
8  →8÷2=4…0
   →4÷2=2…0
   →2÷2=1…0
   →1÷2=0…1

   →1000(2進数)

割り切れなくなるまで、2でわる、
その余りを下から並べたものが答えになります

□10進数から16進数
77 →77÷16=4…13
   →4÷16=0…4

   →4、13
   →4C(13は16進数でいうCなので)

□ビットをたてるとは
例)3ビット目をたてる→3桁目を1にするということ
例)1000→2ビット目をたてる→1010
例)パーミッション

□負の2進数。2の補数。
一番左のビットをたてるとマイナスになる。
もし8ビットで考えた場合
11111111
これを10進数になおすと−1になります。
一番左のビットがたっているので
これはマイナスの値になり、
10000000は−128
 1111111は+127
よって−1になります。

□ビット演算子
1、AND:& 両方のビットがたっていたら、ビットをたてる
2、OR :| どちらか一つでもビットがたっていたら、ビットをたてる
3、XOR:^ どちらか一方のビットがたっていたら、ビットをたてる
4、否定:〜 逆

□課題
1)3ビット目をたてる関数を作ろう
2)8ビット目をたてる関数を作ろう
3)2つの値のANDを2進数で返す関数を作ろう
4)IPアドレス127.0.0.1で与えると、2進数とか16進数になる関数を作ろう

$a = 12;
$b = 9;
$c = 8;
$d = 256;
$ip = "127.0.0.1";


//1)3bit目をたてる関数
function setup_3bit($c)
{
  $up = 4;//2進数で100
  $ans = $c | $up;
  return $ans;
}
echo setup_3bit($c)."\n";


//2)8ビット目をたてる関数
function setup_8bit($d)
{
  $up = 128;
  $ans = $d | $up;
  return $ans;
}
echo setup_8bit($d)."\n";


//3)2つの値をANDを2進数で返す
function setup_and($a,$b)
{
  $ans = $a&$b;
  $ans10 = base_convert($ans,10,2);//10進数を2進数に変換
  return $ans10;
}
echo setup_and($a,$b)."\n";


//4)IPアドレス127.0.0.1を与えると2進数とか16進数になる
function change_addr($ip)
{
  $ip_array = explode(".",$ip);
  foreach ($ip_array as $ans){
    $ans2_array[] = sprintf("%08b",$ans);//2進数変換0詰め
    $ans16_array[] = sprintf("%02x",$ans);//16進数変換0詰め
  }
  $chage_ans2 = implode(".",$ans2_array);
  $chage_ans16 = implode(".",$ans16_array);

  $ansers = "2進数:".$chage_ans2."\n16進数:".$chage_ans16."\n";
  return $ansers;
}
echo change_addr($ip);
?>