【シフト演算子とビット演算子】抽象的プログラミング講座Vol.1
改めまして、シロナです。
あぁ、待ってください。抽象的とか、シフトとかビットとか言っていますが、
この講座は、プログラムを始める前の人向けに始めたものです。
小学校で習う四則演算よりも、簡単な計算です。
コードを書かなくても、コンピュータの中の計算を想像できるようにすること。
それを目的として書き始めました。
■■■■■■■■■■■■■■■■■■■■
躓かないように先に書いておきますと、
シフト演算は、桁を足す、桁を削る
ビット演算は、繰り上がりがない
そういった計算です。
両方とも筆算は要りません。
もしかしたら、購入先の『まとめ』部分を先に見ていった方がいいかもしれません。
■■■■■■■■■■■■■■■■■■■■
近頃、コンピュータが普及しつつ、プログラムを使った自動化等の業務が増えてきました。
しかし、プログラミングの根本的な知識が世の中には足りないと思いました。
なぜなら、何も考えずに読むこともできずに「このコードは、この機能を持つらしいからコピーして貼り付けよう」なんて考えて他人のコードを継ぎ接ぎすれば、作者でさえも見るにも悍ましい、キメラが誕生します。
そして、修正が必要となった場合に、誰も修正できず、また一から作り直す悲惨な出来事になることをよく耳にします。
一転、
今回は、ボクの大好きなバイナリ思考——極論の意味でのバイナリ思考とは差別化を図りたいですが、今のところいい言葉が思い浮かびません。このまま行かせていただきます。——の話から始めたいと思います。
プログラムを深く知る上で、ここだけはまず初めに理解すると、新しい知識が入っても、根本でどう言った処理がされているのか想像が可能になるからです。
◆バイナリとは
バイナリとは、端的に言えば、二進数です。
「0」と「1」のみで保存されたデータです。
洋画のマトリックスを想像されても結構です。
コンピュータ上での、この二進数には、メモリ(記憶媒体)の最初と最後にしか区切りがなく、番号として扱ってその情報を引き出しつつ使用しています。
想像すると酔いますので、ほどほどにしてください。
また、扱いやすいようにバイナリデータを十六進数で表示するソフト*もあります。
十六進数というのは、数を、以下の16文字で表したものです。
123456789ABCDEF0
まぁ、だいたい人には読めるものではないです。読み方は、それぞれのデータの仕様を調べた方がいいでしょう。
ソフト*:ソフトウェア。今は、画面上の道具という認識でいいです。——コンピュータ上でのデータの書き換え、外部デバイスに情報伝達するプログラムの総称——
バイナリは何に使われるか
『バイナリとは』でも言ったように、コンピュータ上で扱うものです。
これからもバイナリは、コンピュータとは関係を切り離せないと思います。
なぜかというと、CDやDVDなどのディスク型のメモリも、
SDカードなどのフラッシュメモリ型のメモリも、
現代のメモリから取り出せるデータは、全て、区切りのないバイナリデータで、出来ているからです。
「区切りがない?ならどうやって文字を取り出してるの?」
これは、話が難しくなりますが、細かい話が苦手な場合は、読み飛ばしてください。
簡単に言えば、「何番目〜何番目までのデータを読み取ります」というのを読み取るソフトが、バイナリデータを区切ります。
——細かく言えば、
CPUという固定されたプログラムが入った細かい端子を通して、
他の様々な端子で値を変換する物理的な作業を行います。
最初の数バイトのデータを使い、どこまでが一連のデータなのかを取得して、その長さだけデータを取り出します。
または、データによっては、最初と最後の情報で仕切る場合もあります。
[あとで改訂すると思います。]
■■■■■■■■■■■■■■■■■■■■
◆シフト演算子-桁を左右にシフトする
それでは、主題に入ります。
演算子というのは、計算処理に使う呪文のようなものですね。
小学校で習った四則演算(➕➖✖️➗)の類も、その一部です。
シフト演算子は、[左項]の値の桁を[右項]の値のぶんだけ、ズラす演算子です。
——厳密な言葉で話すと、冗長になるため、関数特有の引数(ひきすう)、戻り値という言葉は省きます。——
まぁ、言葉で学ぶよりも、式で見た方が早いでしょう。
[左項][演算子][右項]
10 + 01 //= 11
00110110 >> 1 //= 00011011(二進数)
54 >> 1 //= 27(十進数)
00110110 << 10 //= 11011000(二進数)
54 << 2 //= 216(十進数)
どうでしょうか?
いろいろ疑問に思うことはあると思います。
・まずは、二項演算子と言う概念。と、左項と右項
・二行目、足し算の例と、コメントアウト「//」
・三行目以降、シフト演算子記号。右へ左へ
・二進数表示と、十進数表示
以上の4つに分けて説明したいと思います。
・まずは、二項演算子と言う概念。と、左項と右項
[左項][演算子][右項]
プログラム上で計算をする上では、この「演算子」というものは、欠かせません。
なぜかと言っても、
算数で扱う四則演算と、書き方はそれほど変わらないからでしょうか。読みやすくするためには不可欠なのです。
しかし、プログラム上で書く場合、交換法則の原理は捨て去った方がいいです。そういうのは、紙の上で行ってください。
ほとんどの演算子が、左項を主軸にして計算します。
例えば、「56 / 7」とした場合、
「56」が左項、「/」が演算子、「7」が右項になるはずです。
何度も言いますが、基本的な計算では、
[左項][演算子][右項]の関係で成り立ちます。
(その振り分け方に関しては、正規表現を学んでください。非常に複雑です。)
・二行目、足し算の例と、コメントアウト「//」
10 + 01 //= 11
シフト演算子の計算を載せる前に、
皆さんに馴染みのある足し算として記述しました。
因みに、この書き方は、プログラムとしても、算数の計算式としてもアウトです。
皆さんが見てわかる通り、計算式として間違っている。というのは、その足し算の後ですね。「//=」の部分です。
これは、もちろん意図してのことです。
そして、プログラムとして間違っている。というのは、
その、計算式としての結果がどこに出力されるのかを指示していないところにあります。
結果をどうするかを指定しなければ確認することも、保存することも、何もできないですからね。書くだけ無駄です。
「//=」の話に戻りますが、
プログラムでは、証明や、方程式などで使われる意味の等号式は、使いません。
その代わりプログラミングでは、コメントアウト——コメントとも言う——といった機能を使って、プログラムを使う上で無視される文章を扱うことができます。
この、「//」の記号は、
C言語や、JAVAというプログラミング言語におけるコメント記号です。
改行されるまで、「//」以降の文章は無視され、プログラムとして処理されなくなります。
その他、プログラミング言語毎にコメントの仕様は異なります。
BASIC系統:「'」以降改行まで
C言語、Java、JavaScript:「//」以降改行までと、「/*」「*/」の間
Ruby:「#」以降改行までと、「=begin」「=end」の間、等
Python:「#」以降改行までと、「'''」「'''」の間、等
・三行目以降、シフト演算子記号。右へ左へ
やっと、ビット演算子について書くことができます。挫折しそうになりました。
まだ一種類の演算子を紹介するのですよ?
もう、大変です。
まぁ、コメントアウトの説明は省けるので楽になりますね。
00110110 >> 1 //= 00011011(二進数)
54 >> 1 //= 27(十進数)
00110110 << 10 //= 11011000(二進数)
54 << 2 //= 216(十進数)
お気づきだと思いますが、[演算子]の部分に、不等号が2つ続いた記号があります。矢印のように、流れを感じますね。
これが、多くのプログラミング言語で使われるシフト演算子の記号になります。
まず、シフト演算子は2種類あります。
「>>」、「<<」の2つです。
「>>」は、桁の繰り下げ、見た目上の二進数データでは、右に桁がズレます。
その、桁がズレる数は、[右項]の値の数だけズレます。
「<<」は、桁の繰り上げ、見た目上の二進数データでは、左に桁がズレます。
「>>」と同じように、[右項]の値の数だけズレます。
00110110 >> 1 //= 00011011(二進数)
54 >> 1 //= 27(十進数)
例には、左項に二進数の「00110110」を用意しました。
左項の00110110が1つ右にズレて、
00011011になっていますね。
二進数上では、こういった動きをします。
もう一行。最後に(十進数)と書かれた行があります。
二進数「00110110」。
この数は、十進数に直すと「54」になります。
————
二進数の見方を簡単に説明します。
例えば、十進数では右から、一の位、十の位、百の位となっています。
二進数では右から、一の位、二の位、四の位、八の位と、桁が表す位には、2が次々に掛けられていきます。
その位の値が「1」だった場合、「?の位」の?の数を足していけば、その2進数がどういった数なのかがわかります。
・二進数表示と、十進数表示
の説明は、こんなもんでいいでしょうか?
わかりやすい計算を書いた記事はまた後日。
————
冗長になったので再掲。↓
00110110 >> 1 //= 00011011(二進数)
54 >> 1 //= 27(十進数)
実は、
上の行と、下の行。表示が異なるだけで、全く同じ式になっています。
そして、よく見てみると、54から右に1つシフトした数は、27になっていて、
その数は、ちょうど2で割った数になっています。
下の式も見ていきましょう。
00110110 << 10 //= 11011000(二進数)
54 << 2 //= 216(十進数)
「<<」の後ろに二進数で「10」が書いてあります。
これは、十進数で書くと「2」に当たります。
よって、[左項]の値を左に2つシフトする。
といった式になります。
十進数の式を見ましょう。
54を左に2つシフトした値は、216です。
ちょうど、4で掛けた値になっています。
お分かりの通り、「2の冪乗」を掛ける計算にも使えます。ただ、2を掛ける意味合いとしては、読みにくいです。
素直に、掛け算を使った方が修正をしやすいプログラムになりますので、場合を分けて考えてください。
冪乗は、調べてください。(累乗とも言ったような。)
————
シフト演算子の説明は、以上になります。
ここより先の記事は、有料になります。
書く内容は、ビット演算子の[用途]。
仕組みは教わっても、なかなか使い所がわからないものです。
専門的に学習している人でも、使い方を知らないのではないでしょうか?
以下では、そのビット演算子AND、OR、XOR、NOTの用途を紹介いたします。
■■■■■■■■■■■■■■■■■■■■
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?