web-dev-qa-db-ja.com

なぜ16進数を学ぶのですか?

私は一日にかなりの数のイントロプログラミングクラスを受講しましたが、そのほとんどは、見つけたあらゆる種類のプログラミングに足を踏み入れるためです。当然のことながら、ほぼすべてのクラスが同じ形式で実行されます。つまり、ハードウェアの概要、ソフトウェアの概要であり、実際のプログラミングに入ります。ハードウェアとソフトウェアがどのように機能するかを理解することは非常に重要ですが、私は常にすべてのコースにある1つのトピックに戸惑っています。

私が見つけたソフトウェアセクションの紹介では、必ず2進数、16進数、場合によっては8進数のシステムで読み書きできることを常に強調しています。これらのことを理解し、コンピュータがそれらをどのように解釈するかを理解するのは良いことだと私は理解していますが、実際にこれらの数値システムの読み書き方法を知る必要があることに気づいたことはありません。実際、ベース10以外の何かを見たのはCSSの色だけです。これは、www.colorpicker.comのようなものを使用するとさらに簡単です。

私はプログラミングの世界でこれらの非10進数システムの素晴らしい使用法を知らなかったのですか、それともすべてのプログラミング教科書にこれらのセクションを含めるのは古い伝統ですか?平均的なプログラマが実際に8進数を使用する良い例はありますか?

28
jwegner

すべての答えは良いですが、私が最も価値があると思うことについては答えていません。さまざまなベースで「考える」ことを学ぶことで、コンピュータが数値を処理する方法にはるかに流暢になります。

小文字の文字列をかなりうまく格納したい場合は、どうすればよいでしょうか。

まあ、26個の小文字があり、5ビットの数値である0-31の範囲に簡単に変換できます。6つの5ビットの数値を32ビットのフィールド(int?)にパックして、十分な数を残すこともできます。いくつかの句読点。

16進数がこのようなものに役立つと言っているのではありませんが、数値がどのように変換されるかを理解します。

別のケースとして、ASCIIでやや長い数値を渡すためにbase-64を使用することがよくあります。これを実装する方法を知っていますか?なぜそのように実装するのですか?ゲームの登録ボックスに「CDキー」を入力するたびに、それがタイプされていることに気づきましたか?

また、楽しみのために、しばらくベース12をいじってみてください。数学はベース12で非常に興味深いことがわかりました(ベース10は比較して愚かです。6本の指で進化したことを願っています-数学の理解は数十年先になるかもしれません)。一部の非常に賢い初期の人間は、12進法を使用して時計を開発しました。

ベース10には、簡単なパターンを作成する3つの「クールな」数字があり、2、5、9は「マイナー」なクールな数字として8、6、4です。基数12では、2、3、4、6、11が「クール」な数値で、8、9、10が「マイナー」なクールな数値です。つまり、基数12を使用した場合、数値のパターンの認識がはるかに良くなります。私たちはいつも彼らに会っていたからです。

また、バイナリ。あなたは片手で32まで数えることができます-私はかなりそれをします、5まで数えることがそれを切り取らないだけであるときに時々役に立ちます:)

バイナリはとても楽しいですが、うまく翻訳できません。 16進数でうまくいくと、 "A"が1010として、 "5"が0101として表示されるようになり、これらは本当に重要になり始めます。 6番目のビット:00100000を抽出するビットフィールドがある場合、何を「そして」使用しますか?それが0x20であることを知っておく必要があります。

あなたが0x0600で何かを抽出しているコードを見たら、どのビットが抽出されていますか?あなたはそれについて何も考えずに知る必要があります-実際には、0000011000000000と書かれているように読んでください(ただし、ゼロを数える必要がないので読みやすいです)。

なぜ脳とデータ処理能力を制限したいのですか?

14
Bill K

何を学ぶべきか?有能なプログラマーになるには理解異なる数の基数が必要ですが、16進数に関しては、ABCDEFが9の後に来ることを除いて、学ぶべきことはほとんどありません。

44

平均的なプログラマが実際に8進数を使用する良い例はありますか?

オクタル?通常はありませんが、* nixのアクセス許可は例外です。

16進数?あなたは賭けます。組み込みシステムの周りでビットをシャッフルしたり、ビットレベルでプロトコルやファイル形式を調べたりするかなり多くの私たちを無視しています。しかし確かに、アプリケーションやWeb作業を行うのに遠く離れている場合は、簡単にそれを回避できます。

例:マイクロコントローラーなどの構成レジスター。

ランダムにキーをパンチすることによって取得された番号54312を取ります。どのビットが設定されているかわかりますか?できません、少なくとも頭のてっぺんからはずすことはできません。 16進数に相当する場合、それは0xd428です。 それ一方で、私が見ているビットパターンは1101 0100 0010 1000であるとすぐにわかります。それは、そのようなことに対してより論理的に構造化されており、これをすべて必要としていることに気づきます。あなたが金属に近い時。上記の数値が、MCUからのリセット時に取得するものであり、何らかの理由でビット7および9を設定する必要があるとしましょう。 16進数では、結果の数値は0xd6a8になるはずですが、10進数ではわかりますか?それは54952ですが、私に聞いても直感的にはわかりません。確かに、値に640を追加するだけの問題ですが、理解するのはもっと面倒です。もちろん、実際には、ビットを正しい位置にシフトするだけで、ORそれを元の値と同じにすることができますが、最終的な表現が何であるかを知りたい場合があります。

18
n42

平均的なプログラマーが実際に8進数を使用する良い例はありますか?

Unix(またはLinux)でファイルに権限を設定する場合は、3桁の8進数を使用します。 1桁目はユーザーの権限、2桁目はグループの権限、最後の桁は他の全員が取得できる権限です。

先週書いたコードでこの事実を理解しなければなりませんでした。

MD5などの標準的なハッシュアルゴリズムの出力を見ると、16進数で書かれていることがよくあります。これが異常な基底での算術演算につながる多くのケースを見てきました。

浮動小数点が内部的にどのように表現されているか、したがって1/10が正確に表現されていないのかを理解したい場合は、異なる基数で算術演算を行う方法を完全に理解する必要があります。これは、後ろにあなたを噛む日まで突然難解な知識であり、突然あなたは実際に急いでそれを理解する必要があります。

また、コンピュータ内部のデータの基本的なバイナリの性質が判明する他のケースのtonもあります。もちろん、CRUD Webサイトを作成しているだけの場合は、他の誰かがすでに対処したレベルで発生するため、それらに遭遇することはおそらくありません。

12
btilly

うまくいけば、現実の世界では、16進数を2進数から10進数に変換することについてクイズされないでしょう。あなたはあなたが望むどんな方法でも変換するためのあなたの処分でツールを持っているでしょう。

何が起こっているのかを理解する必要があることに同意しますが、なぜそれを調べられるときに記憶するのですか?

ただし、キー番号はたくさん出てくるので(0x64 = 100、0xFF = 255、0xFFFF = 65535など)、覚えておくと便利です。

8675309が2進数、16進数、8進数で何であるかを確認できますか?いいえ、必要なときに開くことができるツールを開くことができます。

9
Dylan Yaga

私が8進数を使用した唯一のことは、UNIXシステムでのファイル許可です。

HexおよびBinaryは、ワイヤプロトコルに近い、またはメタルデータ転送に近い作業を行う場合に非常に役立ちます。基本的にデータはバイナリで流れます。これは、ニブルを一度に16進数として簡単に表されます。

また、データシートでは16進数の値を引用することが多いため、データシートに表示されるとおりにコードで値を表示する方が適切です。

これらのいずれかを多用すると、少なくとも一般的な値については、頭の中で10進数との間の変換にかなり熟練したことになります。

それが言ったすべて;強調が大部分は歴史的なものだと思います。あなたが言うように、10進数以外のものがほとんど必要ないプログラマはたくさんいます。

5
Luke Graham

あなたは実際に2つの数値表現の力を学ぶ理由を求めていますか?

コンピューターは回路で構成されています、電流は2つの異なるレベルの回路を流れ、高低2つのレベルの電流を表します。2桁を使用するのは、2つの状態を保持できるためです。 、1(高)または0(低)。

2桁の数字パターン。たとえば、あなたと私が話すことができる唯一の方法が回路全体である場合、私が手紙Aを送信したい場合は、バイナリパターン1000001を送信することを確立できます。私はlazy、7つの7桁を記憶したくない。むしろ、2の累乗の番号付けシステムを使用して、大きな2進数を小さな1進数に表現します。 8(2 ^ 3)または16(2 ^ 4)を使用できます。

ご覧のとおり、ほとんどのコンピューターハードウェアとソフトウェアはバイナリ表現を使用しており、人間は8進数や16進数などの2のべき乗表現を使用して、より効率的で痛みのない方法でバイナリ表現を読み取っています。

ここで、2つの表現の力を理解する必要がある平均的なプログラマーのexampleを示します。

  1. ASCII
  2. Unicode
  3. メモリ管理プログラミング(スタック、ヒープ、メモリアドレス、コアダンプ)について
  4. デバッグ中
  5. バイナリデータの読み取りは、主に16進エディターで行われます。

これで私の最後の2セントで、2つの表現の任意の力をすぐに学習できると確信しています(イントロプログラミングコースをすでに管理しているため)。 平均的なプログラマであること。

5
Armando

私は8進数を使用したことがありませんが、デバッガーで16進数を表示することは珍しいことではなく、ソースコードで16進数を使用する方が理にかなっていることがあります(通常、基になるデータはビットフラグであるためです)。

3
Loren Pechtel

最近は多くのニーズがあるかどうかはわかりませんが、私がシステムプログラマだった何年も前に、16進数を読んで理解できることが不可欠でした。ストレージダンプ(すべて16進数)が表示され、16進表記をデコードしてIBMアセンブリ言語に戻します。しばらくそれを行った後、あなたは直接それを行うことができるようになります-ヘックスを読み、アセンブリと同等のものを書いてください。デバッグに非常に便利です。 16進値の加算と減算は、ベースレジスタからのオフセットの計算に役立ちました。

今のところそれはほとんど必要ないのではないかと思いますが、それを知ることは悪いことではありません。

3
Simon Knights

2進数/ 16進数の読み取りが「流暢」であるということではありませんが、遭遇したときにすぐにメンタル変換を行うことができるほど快適です。単純な計算に慣れずにプログラミングを想像してください。2を掛ける必要があるたびに計算機に行かなければなりませんでした。

16進数/バイナリは、コンピューターが話す言語であるため重要です。特に、デバッグの演習を行っているときにデータが16進数である場合は、常に16進数/バイナリが使用されます。

また、さまざまな数値型が内部でどのように表現され、算術がどのように機能するかという文脈でbase-2を理解することの重要性も強調します。これにより、たとえば、浮動小数点の丸めの問題と整数のオーバーフローをいつどのように処理するかをよりよく理解できます。

もう1つの例として、ビット単位の演算とビットフラグはプログラミングで広く使用されています。これは、base-2の理解が重要なもう1つの場所です。

3
Scott Wegner

本当に、10以外の何かを見たのはCSSの色だけです。

nicodeコードチャート で文字を検索する必要はありませんでしたか? %20が含まれているURLを見たことがありませんか?使用したことがない [〜#〜] guid [〜#〜] ?見たことがない IPv6アドレス ? SQLでBLOBリテラルを記述したことはありませんか? 16進エディタでファイルを表示したことはありませんか? lotが16進数で表記されているコンピューター関連のものです。

8進数については、今日ではめったにありませんが、Unixファイルシステムのアクセス許可にまだ使用されています。

参照: ビット単位演算の実用的なアプリケーション

「ワイヤに近い」プログラミングを行うことを回避できたとしても、コンピュータがバイナリで動作するという事実に注意することが重要です。1つの簡単な理由があります 抽象化リーク

ほとんどの言語のint抽象化は、固定幅の性質をリークします。整数はオーバーフローし、2のような「丸め」の2進数でオーバーフローします31。 10進数のみの思想家は 2038年のバグ を説明できません。

float/double抽象化は、その基数2をリークします。0.1と書くと、0.1000000000000000055511151231257827021181583404541015625を実際に取得します。また、正確な0.1を期待している場合は、バグが発生します。

2
dan04

他のベースでパターンが単純な特定の数値を認識することは、バグを解決する際の大きな手がかりになることがよくあります。答えが347だけ間違っている場合、それはおそらく何の意味もありませんが、256または128だけずれている場合、それはおそらく何かを意味しています。符号なし16ビットデータ型に-1を入力すると、65535を取得します。これは、65536の1未満です。2^ 16を知っている場合は、問題をすぐに見つけます。

8進数については、 これらの質問 を見て、誤って要求したときに8進数を認識すると、これらの人々のいずれかがより優れたプログラマーになるかどうかを確認します。

2
Kate Gregory

これらのシステムとそれらがどのように機能するかを理解するときに使用できる、非常に効率的な数学およびデータ圧縮技術がいくつかあります。おそらく、最初のいくつかのジョブではそれらをあまり使用しません。しかし、シニアになったときにバックポケットにそれらを入れて、過負荷の過労恐竜サーバーで過負荷のレガシーシステムを実行するように求められたのは、すばらしいことです。
APIを持たないコントローラーや電子機器を扱う場合、それはより重要になります。特に、そのAPIを作成している場合。

1
SoylentGray

コンピュータサイエンスの研究の一部であるプログラミングコースの紹介では、その教材をよく理解していることは理にかなっています。アセンブリ言語でプログラミングするとき、ハードウェアを設計するとき、正式な言語のコースを受講するときなどに、トピックを再訪します。私の大学のすべての電気技術者はプログラミング入門コースを必要とし、彼らはその情報を使い続けるでしょう。それ以外では、それほど重要ではありません。

1
Peter Smith

8進数は、文字セットを処理するときに役立つことがあります。後者はバイトベースで、1つの8進数= 8ビット= 1バイトです。たとえば、UTF-8では、非ASCII文字は2バイト以上になることがあります。 16進数よりも8進数の方が便利です。

ビットは便利です...ちょっと!お使いのコンピューターが常に0と1を処理していることをご存じですか?真剣に言うと... 1 + 1 = 10だと知っているのはコンピューターサイエンティストだけだというのは冗談を言うだけではありません。ビット関連の演算子やvarbitsとしても役立ちます。後者を使用すると、一連のフラグを処理するときに、データベースのストレージ要件を減らすことができます。

16進数については、RPGキャラクターのステータスと装備を強化するために16進数エディターを開いたことがないと思います。文字エディターをダウンロードする代わりに、そうした場合、16進数を理解できると便利な理由がよくわかります。 ;-)

1

私は3年前に大学を卒業しており、16進数の読み書きができることが非常に重要だと思います。私は仕事のためにたくさんの大きなXMLファイルをいじります(大きな意味は100MB +を意味します)。無効なXML文字を含むXMLファイルが表示されることがありますが、これはテキストエディターでは表示できないため、16進エディターを使用してコードを記述し、無効な文字を特定する必要がありました。 16進数を知らないと、その作業は非常に困難になります。

1
Alvin

何年も前に、8ビットシステムで作業中に16進数の値を学びました。

何かがB000またはE7FFにあるという理解の明快さは驚くべきものでした。

昨日、テキストの行末にある文字を正確に知る必要がありました。 0x0Aと0x0A 0x0Dの違いを知ることは非常に重要です。

1
Scott Bruns

平均的なプログラマが実際に8進数を使用する良い例はありますか?

最近の8進数は非常にまれですが、私は16進数を頻繁に使用し、しばしばバイナリの問題について考えます

私は主にCおよびC++でプログラミングし、いくつかのObjective Cを使用して、LinuxおよびMac OS Xのラスターおよびベクターグラフィックスで多くの作業を行います。これらの分野では、効率的に実行され、ストレージをうまく利用するコードを記述することが最も重要です。また、マシンが内部でどのように作業しているのかを理解する必要もあります。これを見る最も便利な方法は16進数です。たとえば、標準の24ビットカラーピクセルは3バイトで表され、0x000000が黒、0x00FF00が赤、0x008000がピンクであることを一目でわかると便利です。

また、ファイル形式の国際標準についてもよく取り組んでいます。私が最近取り組んでいるのはMXFです。MXFは、放送やDVDなどのビデオを保存するために使用されます。これはバイナリ形式であり、16進数またはバイナリでの処理が最も簡単です。一部のMXFベースのビデオがシステムで正しく再生されない理由をデバッグしている場合、32ビットのフィールドを一目見て、画面を非表示にするビットが誤って設定されていることに気づくと非常に便利です。これは16進数ですが、10進数ではほとんど不可能です。

Perlを記述してテキスト文字列をマッサージすることに専念するつもりなら、おそらく、16進数、8進数、または2進数に精通している必要はないでしょう。しかし、あなたが私がしている種類のこと、少なくとも16進数と2進数を扱うことを始めた瞬間は不可欠です。

1
Bob Murphy

あるベースから別のベースへの変換自体は、プログラミングにとってそれほど重要ではないと思います。高レベルのプログラミングでは、変換は必要ありません(そうする必要があるかもしれませんが、lib関数と計算機を使用できます)。低レベルのプログラミングに飛び込むときは、もう入門コースではありません。

基礎コースでは2つの(関連する)問題を取り上げることが重要だと思います。

  1. エンコーディングについて。これは、数学的変換ではなく、数値(任意のタイプの数値)を使用して情報(任意のタイプの情報)を格納することです。必要に応じて、モールス信号または数字によるペイントでこれを説明することもできます。しかし、コンピュータはむしろバイナリを使用し、バイナリは通常16進数として表示されるため、通常はヘキシな例で示されています。 (そして、彼らがそれにいる間、彼らはこのトピックで言及されている行末について少し説明するかもしれません。私はこれが取る可能性のあるさまざまな形と形を認識することをお勧めします、それらのいくつかは0x0D、0x0Aです。 、CRLF、 '\ n'および '\ r')

  2. オーバーフローの問題。繰り返しますが、これを16進数で説明する必要はありません。 y2kの例(16進数とはまったく関係ありません)を使用できます。ここでも、さまざまな最も可能性の高いインジケーター(255、32767、65535、2M14)を認識することをお勧めします。これらのインジケーターがバイト単位の性質に直接リンクしている理由内部ストレージですが、変換は重要な部分ではありません。

あなたがビットフラグについてそれを知る必要があることに私は同意しません(プログラミングの入門コースでは、名前付き定数の方がはるかに教育的で有用であるため)。

0
Inca

低レベルの組み込みプログラミングに入る場合は、16進数を使用します。ハードウェアレジスタでのビットパターンの指定や、メモリダンプでのバイト値の指定などに使用されます。また、使用するプログラミング言語ですべてのビット単位演算子を使用する方法についても学習します。

0
mkClark

プログラマーになりたい場合は、16進数を知っている必要があります。あなたがそれを理解していないことを知る必要があるまれな日に仕事で認めなければならないのはあまりにもぎこちないでしょう。

頭に16進数を追加できる必要があるという意味ではありません。とにかくそうするなら、それは定期的に追加するためのルールをめちゃくちゃに始めます。 :)

0
John Robertson

2進数、16進数、8進数に共通しているのは、それらがbase10ではないということではなく、すべて2の累乗であることです。コンピューターは本質的にバイナリーであるため、データを表示および処理するための最も適切または効率的な方法であるいくつかのアプリケーションをコンピューターに提供します。

これはかつて、すべてのプログラミングが低レベルであったときに非常に重要でした。今日の高水準プログラミングでは、2のべき乗数システムはそれほど重要ではありません。すべてのプログラミングコースでそれらを徹底的に紹介することは、昔の遺物かもしれません。

しかし、これらの数値システムは、高級言語で作業している場合でも、まだ使用されています。たとえば、色は引き続き24ビットで保存され、原色ごとに8ビットです。また、16進数は人間が読める形式でバイトを表現するのに最適な方法であるため、プログラミングの概要をまったく知らない人でも使用できるはずのCSSの一部でもあります。

バイナリを理解しないと、コンピュータを理解することはできません。バイナリ入門は、プログラミング入門のすべてに必要な部分です。日常の作業では、数体系間で多くの変換を行う必要はないかもしれませんが、そのような演習を行うことが、これらの数体系に慣れるための唯一の方法です*。基数が10以外の複数のシステムを知ることは、データをさまざまな方法で表現できることを正しく理解する唯一の方法であり、それらはすべて有効です。

  • ジョンフォンノイマンが言ったように:「私たちは物事を理解していません、私たちは彼らに慣れています。」
0
Waquo