日々、徒然プログラミング。

都内のIT系専門学校に通う、一人暮らし女子学生chocoffeeの、 日々の気づきと学び、たまにほっこりを綴るブログ。

エンジニアのみなさま、エンジニアの卵のみなさま、IT業界のみなさまが
わたしの「チームってなんだ?」というぼやきに反応してくださることを祈って。


こんにちは!
寝不足で 頭が回らないちょこひです。

最近暑くて寝つきが悪い・・・
もちろんエアコンフル稼働ですが、夜は寝冷えは嫌でかなり弱くしていて
たぶん弱すぎて暑くて寝れない。
意味ないじゃん。

暑がりで四季の中で夏がダントツで嫌いなのです。
夏の屋外フェスとか夏のディズニーとかわけがわかりませんもん。
夏は引きこもるに限る。


補数表現

今回は基本情報第二弾。
「補数表現」についてアレします。
補数表現は、PC内部で減算や負の数の保持に使われている表現方法です。

8 - 4 = 4

これと、

8 + (-4) = 4


これは同じ計算ですね。
強いて言うなら、「直接減算している」のか、「負の数を加算」しているのか。

PCではこれらの演算を簡単にするために
負の数を加算する、という回路で処理しています。
その負の数を保持するために補数というややこい奴が登場しています。

補数とは、文字通り「補う数」。

10進数で考えてみると、

123の9の補数は「876」。
123の10の補数は「987」。

これらは、

123を999にするために876を「補っている」という考え方。
123を1000にするために876を「補っている」という考え方。
桁を繰り上げするために876を「補っている」という考え方。

と言えます。
へ〜。そうなんだ〜くらいで大丈夫。

2進数で考えてみると、
1の補数と2の補数しか存在しませんね。2進数ですから。

0101の1の補数は「1010」。
各ビットを反転するだけでOKですね。楽チン。

じゃあ、2の補数は?

ここで考えなければならないのは、2進数に2という数字は登場しないことです。
2になる前に、桁が繰り上がります。

2の補数によって、2進数は繰り上がる、という考え方ですね。


絶対値


負の数を算数で習い始めて最初に聞いた言葉、絶対値
なんかすごくつよそう。

絶対値は、0からの距離のこと。

「絶対値が6の数は?」と聞かれたら
答えは6と-6の二つです。

これらを加算したら、もちろん0になる。

補数表現はこの性質を利用しています。

正の数なのか負の数なのかを最上位ビットで保持しておいて、
負の数の場合は対となる正の数の補数で表現しよう!


というものです。



前述の1の補数を加算すると、
そのビット数で表現できる一番大きな数
→繰り上げしないギリギリの数 になります(以下参照)

blog0708_1


2の補数は、これより1大きければいいので
①ビットを反転
②1を加算

すれば求められます。

0110 を例にすると、

①反転
 0110 → 1001

②1を加算
 1001 → 1010


blog0708_2

例のように4ビットで考えると、
最上位の1は無視されて加算結果が0になったかのように見えます。

これが補数を使った負の数の表現です。


一言でまとめるなら

繰り上がるのに必要な数を絶対値が同じもののペアで認識する

という感じでしょうか。



まとめ


最初は何を言っているのかわからなかった補数表現。
最上位ビットが0なら正の数、1なら負の数。

残ったビットで絶対値表現すればいいのに!
と思っていましたが、やっとこさ理解できました。


これ、まだ参考書の1章なんですよ・・・あかんですよ・・・



ちょこひ

こんばんは!

オリジン弁当のサラダむしゃむしゃして
ご満悦のちょこひです。 

本当はいつものカフェでこの記事を書こうと思ったんですが
あいにく満員で・・・
雨パラパラ来てたし混むタイミングだったし、仕方ないかな。

帰宅して、シャワー浴びて、
サラダむしゃむしゃしながらの執筆です。


基本情報処理技術者試験

 
っていう国家試験があって。

車を運転するには免許が必要なように
エンジニアとしては基本の資格、とされることも多々あるものなんですが。

まー。難しいんですわ。


まず範囲がアホほど広い。
プログラミング系ももちろん出るし、
ハードウェアとか、ソフトウェアとか、広義のIT分野からちょこちょこ出てくる感じ。

CPUの処理性能による応答時間の計算であったり(白目)
記憶媒体の容量計算であったり(吐血)
タスク管理の処理計算であったり(昇天)

普段勉強している世界って本当にITの端っこでしかないんだなあ、
と嫌という程わからせて絶望させてくれる試験です。

しかも暗記系が本当に多くて

以前から暗記科目や暗記の勉強がだいっきらいなわたしは
買った参考書を燃やしたいと考えながらペンを握ってるわけです。


自分で解法や公式の理屈を理解してゴリゴリ解くような勉強は大好き。
なんぼでもできる。
だから数学とか化学は好き。大好き。

でも歴史系とか生物のような暗記系は本当にだめ!楽しくない!
基本情報もこっちに近いんじゃー!やめてけろー!


さらに国家試験故に
年間2回しかチャンスがありません

他のベンダー資格という
どっかの企業が営利目的でやってる資格(小声)は
いつでも受けられるものが多いんです。

有名どころで言えば、
Oracle Javaとか〜、LPICの何やとか〜。

その分受験料がぶっ飛んでますが・・・(3ゆきちとか余裕で飛びます)

なので相当厳しい。



とかなんとかいっても持ってるに越したことはないので
嫌々ながらも(大声)
勉強してます。


その中でつまづいたとことか、
ややこいわ!ってなったことをちまちま書いていこうかと。

丁寧な覚書のようなものですね。
合格したら、新しくブログを作って
基本情報のみの記事を投稿してもいいかもしれん。



 
情報量の接頭語


「えー!そこからかよー!」
というツッコミは勘弁してください。


・・・



だってややこいんだもん!
メガとかギガはまだわかる!!
ちっちゃい方むりだもん!!!わかんないもん!!!!!!
覚えらんないんだもん!!!!普段PCでも見ないし!!!!!!ねえ!!!!!!!




8bit = 1byte


これはさすがに覚えとります。


おっきくなるほうまとめ
-------------------------------------------------
1k(キロ) = 10^3倍 ≒ 2^10

1M(メガ) = 10^6倍 ≒ 2^20 

1G(ギガ) = 10^9倍 ≒ 2^30

1T(テラ) = 10^12倍 ≒ 2^40

--------------------------------------------------

キロ、メガ、ギガ、テラ にはそれぞれ
10の3乗、6乗、9乗、12乗、という意味がある。3の倍数ですね。
そしてそれはほぼ
2の10乗、20乗、30乗、40乗 に相当する。
覚えられる気がしてきた!!

わたしの家には3TBの外付けHDDがあります。
こう見ると相当でかい。

ちなみに、1Kバイト = 1024バイト と表されることもあるようです。
まあほぼ一緒ですね。


そういや、「x^2」のことを皆さん何と言います?
「にじょう」派ですか?「じじょう(自乗)」派ですか?

わたしは階乗を最初に習った先生が自乗派だったので今でも自乗派です。


続いて、

ちっちゃくなるほうまとめ
-------------------------------------------------
1m(ミリ) = 10^-3倍

1μ(マイクロ) = 10^-6倍 

1n(ナノ) = 10^-9倍

1p(ピコ) = 10^-12倍

--------------------------------------------------
 
あれ?

おっきくなる方と絶対値一緒なん?
今気づきました。

おっきい方の指数さえ覚えられればなんとかなりそう。
あとは
ミリ→マイクロ→ナノ→ピコ
の順番さえ覚えられれば・・・


さっきのおっきくなるほうは
データ量の計算問題で頻出するんですが、

こっちの小さい方は
処理時間とかの時間計算で頻出するんです。

「答え:10μ秒」
とか余裕であるんですが、何言ってんのかわからんです。
どんくらいの速さなのかわからんし、
それが他に比べて早いのかもわからん。

勉強すればするほど嫌いになっていく資格は初めてだ・・・
どSすぎるよ・・・(´;ω;`)



まとめ


てな感じで、
言語に比べてちんぷんかんぷんな勉強を
死んだ魚の眼で頑張っている今日この頃です。

次回試験は10月です。
たぶん落ちます。普通に無理だと思います。

本当に狙っているのは、春試験です。
秋はその前の予行演習というか、なんというか。

場慣れしておきたいなーと。

でももし秋で受かったらそれに越したことはないので
本気で勉強します。
夏休みは基本情報勉強に溺れます。グッバイわたしの人生最後の夏休み・・・



ちょこひ

 

こんにちは!
西新宿から大久保までノンストップウォーキングしてお眠なちょこひです。

例えるなら、小学生の頃の2コマ続きの水泳授業の後のような、心地よい眠気。
現実は豪雨と強風の中ビッチョビチョになりながら歩いただけです。
今日も(いつも通り)たくさん眠れそう。


三項演算子って?

今日は春から学び始めたPHPの三項演算子の話をするためだけに
眠い目をこすりながら執筆しています。

三項演算子は、プログラミングの世界では有名ですよね。
条件分岐の手法でよく用いられています。

知らない方のためにちょこっと説明してみます。

「Aさんの名前が太郎くんならTaro、次郎くんならJiro、それ以外ならSaburoと出力する」
というプログラミングを組むとしましょう。

Javaで考えてみると、以下のようになります。

16/06/14追記
Javaで文字列の==はよくないんでした・・・epuals()ですね。
一応動くは動くのですが、あとから修正するかもしれません。



if(aName == "太郎") {			//もし太郎だったら
	System.out.print("Taro");	//Taroと出力
} else if(aName == "次郎") {		//もし次郎だったら
	System.out.print("Jiro");	//Jiroと出力
} else {				//それ以外は
	System.out.print("Saburo");	//Saburoと出力
} 



プログラミングを全く知らない方でも、
なんとなく仕組みがわかるのではないでしょうか。


イコールが2つ続いていますが、これは情報の世界では等号として扱われています


(`・д・´) 「じゃあイコール1つはなんなんだよ!」

イコール一つの場合は、
右辺のものを左辺のものに代入」という意味になります。
等しくありません。代入です。


以下をご覧ください。 
number = number + 1;	


数学者「等しくねえよなーに言ってんだこいつ」
プログラマ「numberは1増えるのか〜 numberが1なら2になるな


こんな感じ。


プログラマ「number って2回書くのだるい…」
で、生まれたのが以下の書き方。


number += 1;	


どんどん短くなってますね。
これも、numberに1を足したものをnumberに代入する、という意味です。


話が逸れましたが、つまり何が言いたいのかっていうと
プログラマはとおおおおおおおおってもめんどくさがりなので
何でもかんでも短く書きたがるんです。


最初の太郎さんたちのコードを見てみましょう。

if(aName == "太郎") {			//もし太郎だったら
	System.out.print("Taro");	//Taroと出力
} else if(aName == "次郎") {		//もし次郎だったら
	System.out.print("Jiro");	//Jiroと出力
} else {				//それ以外は
	System.out.print("Saburo");	//Saburoと出力
} 

プログラマ「なげーよ!!!(゚Д゚)ゴルァ!!」


もちろん、もっと短く書く方法が存在します。 
その一つが三項演算子です。


ふー!導入ながかったあ!!!

 
三項演算子はすごい


ひっぱりましたが、実際に三項演算子を使ってみましょう。

if(aName == "太郎") {			//もし太郎だったら
	System.out.print("Taro");	//Taroと出力
} else if(aName == "次郎") {		//もし次郎だったら
	System.out.print("Jiro");	//Jiroと出力
} else {				//それ以外は
	System.out.print("Saburo");	//Saburoと出力
} 

これが、 
String name = aName == "太郎" ? "Taro" : aName == "次郎" ? "Jiro" : "Saburo";	//条件分岐
System.out.print(name);								//出力命令

こうなる。

('A`) 「わかんねえ」

こちらも解説してみます。 

Stringは、nameには文字列が入るよ!と指定しています。あんま気にしなくていいです。

aName == "太郎" の部分は、イコール2つなので「Aさんの名前は太郎だ!」と言ってます。
これは正しいor誤り の2パターンになりますね。
正しい場合は、?のすぐ後の"Taro"がnameに代入されます。
誤りの場合は、:の後に進みます

すると、「Aさんの名前は次郎だ!」と言ってます。これも2パターンになりますね。
正しい場合は、?のすぐ後の"Jiro"がnameに代入され、
誤りの場合は"Saburo"が代入されます。

やってることは同じなのに、書く量が全然違いますね。
三項演算子はプログラマにモッテモテ。
これが、三項演算子はすごい理由です。

まとめると、

example = a == b ? a : b;

aとbが等しいならexampleにはaが、
等しくないならexampleにはbが代入される、
これが三項演算子です。

 
PHPの三項演算子

では、PHPでも同じ三項演算子を書いてみましょう。
ちょっとだけ書式が違うのですが、書いてあることは一緒です。

$name = $aName == "太郎" ? "Taro" : $aName == "次郎" ? "Jiro" : "Saburo";
echo $name;

書けた。
echoは出力命令です。

さて、aNameを太郎にして動かしてみると・・・


(`・д・´) 「Jiroになった」


・・・次郎だと?


 (`・д・´) 「Jiroになった」


・・・花子なら?


  (`・д・´) 「Saburoになった」



花子がSaburoになったことは放っておいて、 
太郎くん消失事件が発生しました。

太郎くんはどこに行ったのか?
もしかしてPHPは太郎くんに親を殺された恨みがあるのか?
もしかしてPHPは太郎の文字列に反応して正常に動かなくなるバグがあるのか?
もしかしてPHPは問答無用で私のコードを受け付けないのか?
もしかしてPHPは三項演算子使えない?


(・∀・)「仕様がちがうだけやで」 


Javaを始めとする他の言語の大多数は、
三項演算子の動きは同じです。
太郎くんたちの例で言うなら、nameはTaro、Jiro、Saburoの3通りになります。

PHPは、それがちょっと違って、
nameはJiroとSaburoの2通りになってしまうようで。 

具体的にいうと、
$aName == "太郎" 〜 == "次郎"
の部分が正しい場合は"Jiro"に、誤りの場合は"Saburo"になる、らしい。

$name = ($aName == "太郎" ? "Taro" : ($aName == "次郎" ? "Jiro" : "Saburo"));
echo $name;

かっこによって優先順位を変えてあげると、
ちゃんと太郎くんは戻ってきてくれました。
よかったね、太郎くん。


・・・花子ちゃんがSaburoになってる問題は知りません。
わたしわるくない。


まとめ


さて、いつになく真面目な文になりました。
眠い時の方が真面目にかける仕様なわたし。意味がわかりません。

一応PHPの仕様を読んでみたのですが、
そもそもPHPでは三項演算子の入れ子(太郎くんたちのまさにあれ)は
推奨されていないようです。

確かに条件分岐が多いなら他の書き方を使ったほうが
可読性はあるかもしれませんね。

この問題に直面した時はPHPだけ仕様が違うことに
全く解せていませんでした。
激おこぷんぷんまるでした(古い)

いっこいっこ確認しながら勉強を進めていこうと思います。


とりあえず今日は眠い!お家帰って寝るんだー!!!



ちょこひ 

↑このページのトップヘ