おい! http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html でこのコードを見ていました
状況によっては、134行目のように16進数を使用していることに気付きました。
for (j = 1; val && j <= 0x80; j <<= 1, q++)
では、なぜ彼らは0x80を使用するのでしょうか?私は16進数ではそれほど得意ではありませんが、10進数からオンラインの16進数を見つけて、0x80で128を得ました。
また、134行目の前、114行目には次のようになっています。
small_n = (n & 0xffff0000) == 0;
16進数から10進数への変換により、その16進数の4294901760が得られました。この行では、少しANDを作成し、結果を0と比較していますか?
数字だけを使用しないのはなぜですか?誰でも説明して、他の状況の例を教えてください。
また、16進数だけの大きなコード行を見てきましたが、理由は本当にわかりませんでした:(
どちらの場合も、実際の数字ではなく、数字のビットパターンが重要です。
たとえば、最初の場合、j
は1、2、4、8、16、32、64、最後に128になり、ループが進行します。
バイナリでは、つまり、
0000:0001
、0000:0010
、0000:0100
、0000:1000
、0001:0000
、0010:0000
、0100:0000
、および1000:0000
。
CまたはC++にはバイナリ定数のオプションはありませんが、Hexでは少し明確です:0x01
、0x02
、0x04
、0x08
、0x10
、0x20
、0x40
、および0x80
。
2番目の例では、目標は値の下位2バイトを削除することでした。したがって、1,234,567,890の値を指定すると、1,234,567,168になります。
16進数では、0x4996:02d2
で始まり、0x4996:0000
で終わります。
そのビットマスク。 16進値を使用すると、基になるバイナリ表現を簡単に確認できます。 n&0xffff0000
は、nの上位16ビットを返します。 0xffff0000
は、「バイナリで16個の1と16個の0」を意味します。
0x80
は「1000000」を意味するため、「00000001」で始まり、「1000000」までそのビットを左「0000010」、「0000100」などにシフトし続けます
16進数(または8進数)の数字と基になるビットパターンの間には直接マッピングがありますが、10進数の場合はそうではありません。 10進数の「9」は、ビットがどの列に含まれているか、およびそれを囲む数字に応じて、ビットパターンに関して異なるものを表します。ビットパターンと直接的な関係はありません。 16進数では、「9」は、どの列に関係なく、常に「1001」を意味します。 9 = '1001'、95 = '* 1001 * 0101'など。
私の8ビット時代の名残として、16進数はあらゆるバイナリの便利な略記であると思います。ビットの調整は死にかけているスキルです。一度(約10年前)大学で3年目のネットワーキングペーパーを見ましたが、そこではクラスの10%(50人中5人)だけがビットマスクを計算できました。
0xffff0000は、32ビット値で16倍の「1」と16倍の「0」であることを簡単に理解できますが、4294901760は魔法です。
Cファミリーの言語は常に8進数と16進数をサポートしているが、2進数はサポートしていないことは気が狂っています。私は彼らがバイナリの直接サポートを追加することを長く望んでいました:
int mask = 0b00001111;
何年も前に、膨大なビットレベルの数学を含むプロジェクトに取り組んでいたとき、私はうんざりして、8ビットまでのすべての可能なバイナリ値に対して定義された定数を含むヘッダーファイルを生成しました:
#define b0 (0x00)
#define b1 (0x01)
#define b00 (0x00)
#define b01 (0x01)
#define b10 (0x02)
#define b11 (0x03)
#define b000 (0x00)
#define b001 (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)
時折、特定のビットレベルのコードを読みやすくしました。
Hexの最大の用途は、おそらく組み込みプログラミングです。 16進数は、ハードウェアレジスタの個々のビットをマスクしたり、複数の数値を単一の8、16、または32ビットレジスタに分割するために使用されます。
個々のビットマスクを指定する場合、多くの人は次のことから始めます。
#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...
しばらくすると、彼らは次のことに進みます。
#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...
次に、チートを学び、コンパイル時の最適化の一部としてコンパイラーに値を生成させます。
#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...
HEXの値の視覚的表現により、コードがより読みやすく、または理解しやすくなる場合があります。たとえば、ビットマスクまたはビットの使用は、数値の10進表現を見たときに非自明になります。
これは、特定の値タイプが提供しなければならないスペースの量に関係する場合があります。
典型的な例はバイナリ設定である可能性があるため、10進数を使用して一部の値を表示する代わりに、バイナリを使用します。
オブジェクトに、オンまたはオフ(3つ)の値を持つ非排他的なプロパティセットがあるとします。これらのプロパティの状態を表す1つの方法は3ビットです。
有効な表現は10進数で0〜7ですが、それほど明白ではありません。より明白なのはバイナリ表現です:
000、001、010、011、100、101、110、111
また、一部の人々は、hexに非常に満足しています。また、ハードコードされたマジックナンバーはそれだけであり、使用するナンバリングシステムに関係なくそれほど重要ではないことに注意してください
それがお役に立てば幸いです。
一般に、10進数の代わりに16進数を使用するのは、コンピューターがビット(2進数)を処理するためであり、16進数を使用する方が16進数を使用する方が理解しやすいためです。 。
OxFF = 1111 1111 ( F = 1111 )
だが
255 = 1111 1111
なぜなら
255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc
見えますか? 16進数からバイナリに渡す方がはるかに簡単です。
1バイトに8ビットがあります。 16進数の基数16は簡潔です。可能なバイト値は、コレクション0..9の2文字に加えて、a、b、c、d、e、fを使用して表されます。
ベース256はより簡潔になります。可能なすべてのバイトには独自の単一文字を使用できますが、ほとんどの人間の言語は256文字を使用しないため、Hexが勝者です。
簡潔であることの重要性を理解するために、1970年代に、メガバイトのメモリを調べたいとき、16進数で印刷されたことを考慮してください。印刷には、数千ページの大きな用紙が使用されます。 Octalはさらに多くの木を無駄にしたでしょう。
16進数または16進数は、4ビットのデータ、0〜15、または16進数0〜Fを表します。2つの16進数値は1バイトを表します。
より正確には、16進数と10進数はすべて数字です。基数(基数10、16など)は、これらの数値をより明確に、またはより便利に表示する方法です。
「何かがいくつあるか」を議論するときは、通常10進数を使用します。コンピューター上のアドレスまたはビットパターンを見るときは、通常、個々のバイトの意味が重要になることが多いため、16進数が通常好まれます。
16進数(および8進数)には2のべき乗であるという特性があるため、ビットのグループ化はうまくマッピングされます。 Hexは4ビットを1つの16進ニブル(0〜F)にマップするため、1バイトは2つのニブル(00〜FF)に格納されます。 OctalはDigital Equipment(DEC)やその他の古いマシンで人気がありましたが、1つの8進数は3ビットにマップされるため、バイト境界をうまく越えません。
全体として、基数の選択は、プログラミングを容易にする方法です。ドメインに最も適したものを使用してください。
ファイルを見ると、それはかなり大きなコードです。 Cが得意で、チュートリアルとして使用しないことを願っています...
16進数は、ビットレベルまたはそのすぐ上で直接作業している場合に便利です。たとえば、デバイスから入ってくるビットを直接見るドライバーで作業し、他の誰かが首尾一貫した結果を読み取れるように結果を調整します。コンパクトで読みやすいバイナリの表現です。