読者です 読者をやめる 読者になる 読者になる

新人ぷろぐらまの覚え書き

最近プログラマーに転職したアザラシのブログ。

n進数について

n進数のnの文字は桁が進む数を表す。
基数…基本となる数(n進数のnにあたる部分)
2進数だと、桁が上がるたびに値が2倍になる→これを2進数が持つ各桁の重みという。

桁が上がるたび(1→10→100→1000)

1→2倍→4倍→8倍・・・と倍々になっていく。

基数変換:別の基数表現に置き換えること
・n進数を10進数に基数変換する→各桁に重みをかけていけばいい

 

2進数を8、16進数にするのは簡単!

2進数の3桁は8進数の1桁、2進数の4桁は16進数の1桁に当たるため、

・2進数を8進数に変換する

→2進数を3桁ごとに区切り、区切り単位で10進数に直す→8進数に直す

・2進数を16進数に変換する

→2進数を4桁ごとに区切り、区切り単位で10進数になおす→16進数に直す

 

例えば、10011011.1という2進数の文字列があったとして

8進数に基数変換

①3桁に区切る(桁が3桁に足りない場合は0を補う)

010+011+011+.100

②それぞれを10進数に基数変換し、くっつけた値が8進数での表示になる

2+3+3+0.5=233.4

16進数に基数変換する場合

①4桁に区切る(桁が4桁に足りない場合は0を補う)

1001+1011+.1000

②それぞれを10進数に基数変換し、くっつけた値が16進数での表示になる

(9以上の値はA~Fに変換する)

9+11+0.8

11は16進数ではBなので、9B.8

2進数での負の数の表し方=補数を用いる

補数は2種類ある。
①その桁数での最大値を得るために補う数
②次の桁に繰り上がるために補う数
例)123という数があったら(10進数)
①その桁数での最大値を得るために補う数(999にしたい)=876(9の補数)
②次の桁に繰り上がるために補う数(1000にしたい)=877(10の補数)

次の桁に繰り上がるために補う数をコンピュータでは負の数として扱う

(つまり↑の②が負の数に当てはまる)


※8ビットで考えるとき、11111111=255になる
つまり、負の数は足して256になる数を求めればいい、という考え方もできる
例えば15は241足せば256になるので、補数は241

・シフト演算(かけざん、割り算)
2進数を表すビット列を左、もしくは右にずらす操作
左にずらすと*2、右にずらすと/2になる
論理シフト…符号は考慮せず行うシフト操作

(シフト操作して、はみ出たビットは削除足りないビットは0を補う)
算術シフト…+-を考えたシフト。先頭の符号ビットは固定にし、

それ以外のビットをシフトする。
右算術シフトの場合には、空いたビットは符号ビットで埋めることに注意

 

・小数点を含む数の表し方
固定小数点数…ビット列のどの位置に小数点があるかを暗黙了解として扱う。整数部、小数部に分けて考える。整数を表すときに使う(int型など)
浮動小数点数…指数表記を用いて数値を扱う。(float型、double型など)
符号部、指数部、仮数部の値をビットに割り当てて、±m*2e、という形で表す

 

浮動小数点数の正規化
有効な仮数部をできるだけ有効に使えるよう、小数点の位置を指数部で調整すること。
有効な桁数を多くとることができると、その分誤差が減る。
S:符号
E:指数部
M:仮数

 

浮動小数点の誤差
実際の数値とコンピュータ内部で表現できる数値との間に生じたずれを誤差という。
ちょっとした誤差が積み重なることで不具合が発生することもあるので注意すること。

誤差は以下の5種類。
桁あふれ…演算した結果がコンピュータの扱える最大値や最小値を超えることによって起きる
対策:データ型のサイズを大きくする。(int型でオーバーするならlong型にする、float型をdouble型にするなど)
アンダーフロー:最小値を超えてしまうこと。(限りなく0に近い実数によって浮動小数点の指数部がパンクして精度が保てなくなる)
オーバーフロー:最大値を超えてしまうこと。

情報落ち…絶対値の大きな値と小さな値の加減算を行ったときに、小さな値が反映されないこと。
対策:絶対値の大きい値に小さい値をいきなり足さない。あらかじめ小さい値同士で足し算をして大きい値にしてから大きい値と足す
打ち切り誤差…円周率の計算など、終わりがない計算を実行したときに途中で打ち切ることによって生じる誤差
対策:誤差がどのくらいまで許されるのかを考えて計算を打ち切る桁を決める
桁落ち…絶対値がほぼ等しい値同士の差を求めたときに、有効な桁数が大きく減ることで生じる
対策:差が小さい引き算はしないように工夫する
丸め誤差…表現できる桁数を超えてしまったときに、最小桁よりも小さい部分が四捨五入や切り上げ、切り捨てを行うことによって発生する
対策:データのサイズが大きい型を使う

 

基数変換の計算に時間がかかってしまうので、練習しなきゃだな〜

2進数はパッと見て桁の重みを計算して10進数に変換できるようになりたい。