投稿

7月14日(木)2コマ目

イメージ
今日、やったこと 文字コード 今日のホワイトボード [符号化方式]Shift_JIS 1文字が1バイト(半角文字)、2バイト(全角文字)と可変長。 図 Shift_JIS 飛ばした演習問題 スライドNo.41 EUC-JPで符号化 (半角)1 ASCIIなら0x31。ASCIIの文字はEUC-JPでも同じ値に符号化されるので、0x31。 (半角)イ 半角のイはJIS X 0201では0xB2。 JIS X 0201の文字は 1バイト目に0x8Eを付加。 2バイト目はJIS X 0201で符号化した値。 よって、0x8E 0xB2。 (半角)ヌ 半角のヌはJIS X 0201では0xC7。 JIS X 0201の文字は 1バイト目に0x8Eを付加。 2バイト目はJIS X 0201で符号化した値。 よって、0x8E 0xC7。 スライドNo.42 EUC-JPで符号化 (全角)イ 全角のイはJIS X 0208の5区4点。 JIS X 0208の文字は 区、点に0xA0を足す。 よって、0xA5 0xA4。 (全角)ヌ 全角のイはJIS X 0208の5区44点。 JIS X 0208の文字は 区、点に0xA0を足す。 1バイト目は 0x05 + 0xA0 = 0xA5。 2バイト目は 44 => 0x2C 0x2C + 0xA0 = 0xCC。 よって、0xA5 0xCC。 スライドNo.56 UTF-8で符号化 1 1はUNICODE符号ではU+0031。 この範囲はASCIIで変換した値のままの1バイト。よって、0x31。 A ※Aではなく、Aに̈(ウムラウト)が付いた文字。 ▼▼▼▼ 間違えていました。ごめんなさい。 ▼▼▼▼ UNICODE符号ではU+00C4。 この範囲は必要なビット長は11ビット。よって、UNICODE符号の00C4を11ビットにすると、     C  4  000 1100 0100 となる。これを2バイトのフォーマット(0000 0yyy xxxx xxxx)にあてはめると、  0000 0000 1100 0100 となる。16進数で表すと、  0x00 0xC4 となる。よって、0x00 0xC4。 ▲▲▲▲ 間違えていました。ごめんなさい。 ▲▲▲▲ ▽▽▽▽ ここからが正解 ▽▽▽▽ UNICODE符号ではU+00C4。...

7月13日(水)1コマ目

イメージ
今日、やったこと 誤差 文字コード 今日のホワイトボード 誤差 オーバーフロー データがデータサイズより大きくなると発生。 アンダーフロー 浮動小数点データが最小値より小さくなると発生。 丸め誤差 データサイズに収めるために、あるケタより小さい桁の 値を丸めてしまう (切り上げや切り捨てを行う)ことで発生する誤差。 ケタ落ち 近い値同士の減算をした場合のように 有効ケタ数が減ってしまう ことで発生する誤差。 情報落ち 非常に離れた値同士の計算を行う際、 ケタ数を合わせるためにデータが欠落する ことで発生する誤差。 文字コード 「文字コード」という言葉がごちゃごちゃに扱われているので注意!! 符号化方式を文字コードと呼んだり 符号化されたデータを文字コードと呼んだり 文字集合・符号化 文字集合は符号化する文字のあつまり。 文字は符号化方式に従って符号化される。 図 文字集合・符号化 用語解説 JIS、ISO いずれも規格(ルール)を決める団体および規格名の総称。 図 JIS、ISO エンコード・デコード データを符号化することをエンコード。 符号化されたデータをもとに戻すことをデコード。 図 エンコード、デコード ASCIIで符号化すると プログラムで文字を変数に代入すると、各変数のメモリ上のデータは下図のように符号化された値が代入されている。 図 C言語での文字の扱い 次回は 文字コードの続きをやります。 また、誤差のテストをそのうちやります。(多分、次回はやらない) 

6月29日(水)1コマ目

イメージ
今日、やったこと ビットシフトで掛け算 誤差(オーバーフロー、アンダーフロー) 今日のホワイトボード ビットシフトで掛け算 2進数の場合、x2 n なら、nビット左シフト。 もし、2 n にならない場合は、(2 n1 +2 n2 +・・)のようにバラシて。 図 左シフトで掛け算 問4 5×6 = (4 + 1)×6 = (2 2 + 2 0 )×6 でも可。 図 左シフトで5×6 問5 ー7は絶対値7の2の補数で表す。 図 左シフトでー7×7① 図 左シフトでー7×7② 誤差 真値からの差が誤差。 コンピュータではやり方によっては誤差が発生します。 どんなときにどんな誤差が発生するかを把握しておいた方がいい。 オーバーフロー たとえば、char型(unsigned char型も)ならビット長は1バイト(8ビット)。この範囲を超えると誤差が発生する。 サンプルプログラムでは1からどんどんインクリメント(+1)していくと、254、255の次は256ではなく、0になってしまう。これはオーバーフローが発生したため。 図 オーバーフロー アンダーフロー 整数型では発生しないが、実数型(float型、double型)で計算結果が最小値より小さくなる場合に発生する。 サンプルプログラムではfloat型の1.0を÷2(1ビット右シフト)して、さらに÷2してを繰り返す。 途中で突然0になってしまう。...

6月22日(水)1コマ目

イメージ
今日、やったこと [確認テスト]浮動小数点形式 ビットシフト 今日のホワイトボード 論理シフトと算術シフト 右シフトには論理シフトと算術シフトがあります。 どちらを使うかはシフト対象ビット列が符号あり、符号なしで決まります。 符号なしビット列なら論理シフト(無条件に0を入れる) 符号ありビット列なら算術シフト(符号ビットと同じ値を入れる) 図 論理シフトと算術シフトの使い分け 演習問題 問2 符号ありビット列なので、右シフトは算術シフト。 図 問2 問3  16進数1ケタは2進数4ビット。 16進数=>2進数なら、16進数1ケタを4ビットの2進数に変換。 2進数=>16進数なら、2進数4ビットを1ケタの16進数に変換。 図 問3 左シフトは 結論から言えば、 掛け算 。 10進数で考えてみると以下のとおり。 図 左シフトは 一般化すると、 左シフトは  ×基数 シフトしたビット数 右シフトは 結論から言えば、 割り算 。 10進数で考えると以下のとおり。 図 右シフト 一般化すると、 右シフトは  ÷基数 シフトしたビット数 コンピュータの四則演算 下表のように計算をしている。 演算 実現方法 + 加算器回路で計算 - 負数を2の補数表現にして、加算器で加算 ...

6月15日(水)1コマ目

イメージ
今日、やったこと [確認テスト](負数あり)2進数=>10進数 (浮動小数点形式)2進数=>10進数 バイアス値について ビットシフト 今日のホワイトボード (浮動小数点形式)2進数=>10進数 単精度浮動小数点形式のフォーマットに従って、ビット列を解釈すればOKです。 問6 指数部の8ビットの値はバイアス値が加算されている点に注意してください。 仮数部の23ビットの値は正規化した仮数のうち、小数部だけです。整数部は1です。 図 (浮動小数点形式)2進数=>10進数 問6 問7 問6とおなじようにすれば問題ありません。 図 (浮動小数点形式)2進数=>10進数 問7 バイアス値について 指数部の値にバイアス値127を加えるのは、 ビット列を単純に大小比較できるようにするため です。 また、よくよく考えるとバイアス値は128では?と思うかもしれません。 指数部がオール0、オール1にはそれぞれ意味があるため、バイアス値を127にしています。 詳しくは今日配布した資料を確認してください。 ビットシフト ビット列を左右にずらすことをビットシフトと呼びます。 左にずらせば左シフト、右にずらせば右シフトです。 図 ビットシフト 演習問題 問1 次回は、ビットシフトをもう少し詳しくやります。 次回は 浮動小数点形式のテストをします。 10進数=>2進数、2進数=>10進数両方です。

6月8日(水)1コマ目

イメージ
今日、やったこと 浮動小数点形式 今日のホワイトボード 小数の表し方 小数点の位置を固定する、しないで以下の形式があります。 図 固定小数点形式、浮動小数点形式 浮動小数点形式での2進数の小数 以下のようにあらわす。2進数なので基数は2。 図 浮動小数点形式で2進数の小数をあらわすと 正規化 10進数の小数を浮動小数点形式の2進数にする際、正規化を行い仮数部を1.xxxにする。 図 正規化 練習問題 10進数の小数を浮動小数点形式の2進数にする問題をやりました。 問1 図 問1 問2 図 問2 問3 図 問3 問4 図 問4 すいません。ホワイトボード間違ってます。 111.1を正規化すると、1.111×2 2 です。 問5 図 問5 次回は やるはずだったテスト(2進数=>10進数(負数あり))をやります。  

5月25日(水)1コマ目

イメージ
今日、やったこと [確認テスト]負の10進数=>2進数 2進数=>10進数(負数あり) 今日のホワイトボード 2進数を10進数へ(負数あり) 2進数にした際、負数は絶対値の2の補数で表す場合での10進数への基数変換の方法です。 図 2進数=>10進数(負数あり) ①最上位ビットチェック 0なら正の数=>いままでどおりのやり方で10進数へ 1なら負の数=>②へ ②1の補数へ この2進数は絶対値の2の補数。 まずは1の補数へ変換。  2の補数 = 1の補数 + 1 より、   1の補数 = 2の補数 - 1 ③元の数の絶対値へ 元の数の絶対値に戻すには、 ビット反転 。   ④10進数へ 絶対値を10進数へ。 ⑤符号をつける 負の数なので、-をつける。 ②、③を一気にやる方法 1の補数にして、元の絶対値にして、と何段階もやらなくてもできます。 例えば4ビットの場合  2の補数 = 10000 - 元の数  元の数 = 10000 - 2の補数 4ビットなら  5ビットの最小値 - 2の補数  で元の数がわかります。 練習問題 ⑩はひっかけです。ビット列が指定ビット長に足りません。 足りない場合は、上位ビットに0を追加してください。 図 ビット長に足りない場合 次回は 2進数=>10進数(負数あり)のテストをします。

5月18日(水)1コマ目

イメージ
今日、やったこと 負の10進数を2進数へ基数変換 今日のホワイトボード 負の10進数を2進数へ基数変換 負の10進数を2進数で表す際、絶対値の2の補数(基数の補数)で表します。 10進数の-4を4ビットの2進数に変換する場合 ①-4の絶対値を求める  -4の絶対値は4。 ② 4を4ビットの2進数へ  0100になる。 ③2進数0100の2の補数を求める  5ビットの最小値(10000)からの引き算で求めると  10000 - 0100 = 1100  1の補数=>1の補数+1で求めると  1の補数は 1011  +1すると 1100 この1100が10進数-4を4ビットの2進数にした値。 なぜ負数を2の補数で表すのか? 引き算が足し算でできるから。 図 なぜ負数を2の補数で表すのか? コンピュータに足し算回路さえあれば2進数の足し算と引き算ができることになります。 なぜ、引き算が足し算でできるのか? ポイントは計算する桁数を縛ることです。 4ビット同士の計算なら結果も4ビットに。 5ビット目にケタ上がりする値は無視。 図 なぜ足し算で引き算ができるのか? 10進の場合も同じように計算する桁数を縛れば、負数を絶対値の10の補数(基数の補数)で表せば、足し算で引き算ができる。 次回は 10進数の負数を2進数へ基数変換するテストをします 。

5月11日(水)1コマ目

イメージ
今日、やったこと (おさらい)N進数の足し算、引き算 (おさらい)N進数の基数の補数、減基数の補数 2進数での負数の表現方法 今日のホワイトボード (おさらい)N進数の足し算、引き算  8進数を題材にしました。8進数の引き算では上のケタから借りてくるのは8。 図 8進数の引き算 (おさらい)基数の補数、減基数の補数 基数の補数は足すとケタ上がりする最小値。 減基数の補数は足すとケタ上がりしない最大値。 2進数の場合 引き算の際、上のケタから借りてくるのは2。 また下のケタに2を貸すと、その桁の値は1減。 図 2進数での2の補数、1の補数 4進数の場合 引き算の際、上のケタから借りてくるのは4。 また下のケタに4を貸すと、その桁の値は1減。 図 4進数での4の補数、3の補数 2進数での負数の表現 絶対値の2の補数 で表す。 10進数の負数を2進数にするには ①絶対値を2進数へ ②変換した2進数の2の補数を求める 図 2進数で負数を表現する なお、2の補数を求める際の引き算が苦手な方は ①まず1の補数へ これは簡単。ビットを反転(0->1、1->0)するだけ。 ②1の補数にプラス1 1の補数+1で2の補数になる。 図 簡単な2の補数の求め方 まとめ 2進数の足し算、引き算をする機会がちょこちょこあります。 理屈は普段の10進数の足し算、引き算と同じです。 10進数は10でケタ上がり=>上のケタから10を借りる 2進数は2でケタ上がり=>上のケタから2を借りる

4月28日(木)1コマ目

イメージ
今日、やったこと 基数の補数 減基数の補数 今日のホワイトボード 10進数の場合 基数の補数(10の補数) 足すとケタ上がりする最小の数 。 n->10、nn->100、nnn->1000、nnnn->10000・・にするために補う数。 減基数の補数(9の補数) 足すとケタ上がりしない最大の数 。 n->9、nn->99、nnn->999、nnnn->9999・・にするために補う数。 図 基数の補数、減基数の補数(10進数の場合) 2進数の場合 減基数の補数(1の補数) 足すとn->1、nn->11、nnn->111、・・になる数。 要は0のところが1になればいいので、 ビット反転(0->1、1->0) するだけ。 図 減基数の補数(1の補数) 基数の補数(2の補数) 足すとn->10、nn->100、nnn->1000、・・と ケタ上がりする数 。 減基数の補数(1の補数)に1を加えた数 が基数の補数になる。 図 基数の補数(2の補数) 8進数での基数の補数、減基数の補数 8進数は8でケタ上がりする。 引き算の時、上のケタから借りてくるのは8。 減基数の補数(7の補数) 足すとn->7、nn->77、nnn->777、・・になる数 。 引き算してください。上のケタから借りてくるのは8。 基数の補数(8の補数) 足すと n-> 10、n n-> 100、nn n-> 1000、・・とケタ上がりする数 。 引き算してもいいですが、減基数の補数(7の補数)に1加えてもOK。 図 8進数でのヒント 次回は テストはしません。 多分、補数のおさらいをすると思います。よい連休を!!  

4月27日(水)1コマ目

イメージ
今日、やったこと [テスト]小数の基数変換 2進数の足し算、引き算 今日のホワイトボード 2進数の足し算 ポイントは 2で繰り上がり(ケタ上がり) 。 図 2進数の足し算 2進数の引き算 ポイントは 上のケタから2を借りてくる 。 図 2進数の引き算 N進数の足し算 たとえば、8進数の場合。 図 8進数の足し算 8進数なら8で繰り上がり(ケタ上がり)。 N進数ならNで繰り上がり。 まあ、どうでもええ話ですが 今日やった小数の基数変換のテストを採点しました。 落ち着いて計算してください。  

4月25日(月)2コマ目

イメージ
今日、やったこと 10進数の小数をN進数へ基数変換 今日のホワイトボード そもそも小数は 小数の各ケタの数はケタの重みがいくつあるかです。 例えば、10進数の小数の小数第1位のケタの数は0.1(10 -1 )がいくつあるかです。 小数第2位のケタの数は0.01(10 -2 )がいくつあるかです。 2進数の場合、小数第1位のケタの数は0.5(2 -1 )がいくつあるかです。 小数第2位のケタの数は0.25(2 -2 )がいくつあるかです。 図 小数のケタの数は 10進数0.23は0.1(小数第1位)が2こ、0.01(小数第2位)が3こあります。 こんな0.23に10を掛けると2.3になります。整数部の2はもともと小数第1位のケタの数です。 10進数なので、10を掛けるとケタが1つ大きくなるため、小数第1位のケタの数が整数部にケタ上がりするわけです。 2進数の場合も同じで、2を掛けるとケタが1つ大きくなるため、小数第1位のケタの数が整数部にケタ上がりします。 10進数の小数を2進数へ 結論から言えば、 ①変換後の基数2を変換対象の10進数の小数にかける  答えの整数部は変換後の小数第1位のケタの数 ②①の答えの小数部に2をかける  答えの整数部は変換後の小数第2位のケタの数 ③答えの小数部が0になるまで続ける です。 図 10進数の小数を2進数へ 10進数の小数をN進数へ 2進数への変換と同じです。 ①変換後の基数Nを変換対象の10進数の小数にかける  答えの整数部は変換後の小数第1位のケタの数 ②①の答えの小数部にNをかける  答えの整数部は変換後の小数第2位のケタの数 ③答えの小数部が0になるまで続ける 整数部がある小数を変換する 整数部と小数部を別々に変換後、いっしょにしてください。 次回は テストをします。範囲は N進数の小数を10...

4月21日(木)1コマ目

イメージ
今日、やったこと [テスト]10進数をN進数へ基数変換(N>10) 8進数,16進数を直接2進数へ基数変換  N進数の小数 今日のホワイトボード 8進数、16進数を直接2進数へ基数変換 8進数なら、各ケタの数を3ビットの2進数へ変換。 16進数なら、各ケタの数を4ビットの2進数へ変換。 図 2進数を直接8進数、16進数へ基数変換 N進数の小数 小数の場合、ケタの重みはN-1、N-2、となるだけ。 あとは今までと同じ。ただし、分数が出てきます。分数の計算が苦手な人にはつらいかも。 図 小数の場合のケタの重み 次回は テストはしません。

4月20日(水)1コマ目

イメージ
今日、やったこと 10進数をN進数へ基数変換(Nは10より大) 2進数を直接8進数、16進数へ 今日のホワイトボード 10進数を12進数へ基数変換 基本的に前回の10進数をN進数へ基数変換と同じ。 ただ、割り算の余りには10以上の値がでることもある。この時は余りをさらに12進数へ変換する点に注意!! 図 10進数を12進数へ基数変換 10進数の10以上の値を12進数、14進数、16進数にすると下図のようになる。 9以上の値はa、b、c、・・となる。 図 10進数と12進数、14進数、16進数 2進数を直接8進数へ基数変換 わざわざ ①2進数を10進数へ基数変換 ②10進数を8進数へ基数変換 と2段階で変換しなくてもできる。 2進数を下位ビットから3ビットずつ8進数へ基数変換すれば8進数になる 。 図 2進数の下位ビットから3ビットずつ区切ると 8進数の基数8は23。よって、2進数3ビットが8進数の1ケタになる。 2進数100101を8進数にする際も、最下位ビットから3ビットずつ区切り、各3ビットを8進数にすれば8進数に変換できる。 図 2進数100101を8進数へ基数変換 2進数を16進数へ直接基数変換 2進数の4ビット分が16進数の1ケタ分 になる。 16進数の基数16は24。よって、2進数4ビットが16進数の1ケタになる。 図 2進数を16進数へ直接変換 2進数10111101を16進数に直接変換するには 下位ビットから4ビットずつ区切り、各4ビットを16進数に変換。 図 2進数10111101を16進数へ直接基数変換 次回は 10進数をN進数へ基数変換(N>10)のテストをします。