質問
ちょっと!このコードは 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進(または8進)数字と基礎となるビットパターンとの間には直接のマッピングがありますが、10進の場合はそうではありません。 10進数の「9」は、ビット列に関して、その列がどの列に含まれているかによって、ビットパターンに関して異なるものを表します。ビットパターンと直接的な関係はありません。 16進数では、「9」は、どの列に関係なく、常に「1001」を意味します。 9 = '1001'、95 = '* 1001 * 0101'など。
8ビット時代の名残として、16進数はあらゆるバイナリの便利な略記であることがわかりました。ビットの調整は死にかけているスキルです。一度(約10年前)大学で3年目のネットワーキングペーパーを見ましたが、そこではクラスの10%(50人中5人)だけがビットマスクを計算できました。
ビットマスク。 16進値を使用すると、基になるバイナリ表現を簡単に確認できます。 n&amp; 0xffff0000
は、nの上位16ビットを返します。 0xffff0000
は、「バイナリで16個の1と16個の0」を意味します。
0x80
は「1000000」を意味するため、「00000001」から始めます。そして、そのビットを「0000010」、「0000100」など、「1000000」まで左にシフトし続けます
0xffff0000は、16倍の「1」であることを簡単に理解できます。および16回の「0」 32ビット値で、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の値の視覚的表現により、コードがより読みやすく、または理解しやすくなる場合があります。たとえば、ビットマスクまたはビットの使用は、数値の10進表現を見たときに非自明になります。
これは、特定の値型が提供しなければならないスペースの量で行うことができるため、役割を果たしている可能性があります。
典型的な例はバイナリ設定である可能性があるため、10進数を使用して値を表示する代わりにバイナリを使用します。
オブジェクトに、オンまたはオフ(3つ)の値を持つ非排他的なプロパティセットがあるとしましょう。これらのプロパティの状態を表す1つの方法は3ビットです。
有効な表現は10進数で0〜7ですが、それほど明白ではありません。より明白なのはバイナリ表現です:
000、001、010、011、100、101、110、111
また、一部の人々は16進数に非常に慣れています。また、ハードコードされたマジックナンバーはそれだけであり、使用するナンバリングシステムに関係なくそれほど重要ではないことに注意してください
お役に立てば幸いです。
一般に、10進数の代わりに16進数を使用するのは、コンピューターがビット(2進数)を処理するためであり、16進数を使用する方が16進数を使用する方が理解しやすいからです。 10進数から2進数。
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進数からバイナリに渡す方がはるかに簡単です。
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...
バイトには8ビットがあります。 16進数の16進数は簡潔です。可能なバイト値は、コレクション0..9の2文字に加えて、a、b、c、d、e、fを使用して表されます。
ベース256はより簡潔になります。可能なすべてのバイトには独自の単一文字を使用できますが、ほとんどの人間の言語は256文字を使用しないため、Hexが勝者です。
簡潔にすることの重要性を理解するために、1970年代にメガバイトのメモリを調べたいとき、16進数で印刷されたことを考慮してください。印刷には、数千ページの大きな紙が使用されます。 Octalはさらに多くの木を無駄にしたでしょう。
より正確には、16進数と10進数はすべて数字です。基数(基数10、16など)は、これらの数値をより明確に、またはより便利に表示する方法です。
「何かあるものの数」について議論するとき通常、10進数を使用します。コンピューター上のアドレスまたはビットパターンを調べるときは、通常、個々のバイトの意味が重要になる場合があるため、16進数が通常好まれます。
16進数(および8進数)には、2のべき乗であるという性質があるため、ビットのグループ化はうまくマッピングされます。 16進数は4ビットを1つの16進数ニブル(0〜F)にマップするため、1バイトは2つのニブル(00〜FF)に格納されます。 OctalはDigital Equipment(DEC)およびその他の古いマシンで人気がありましたが、1つの8進数は3ビットにマップされるため、バイト境界をうまく越えません。
全体として、基数の選択はプログラミングを容易にする方法です。ドメインに最も一致する基数を使用してください。
16進数(16進数)は、0から15または16進数で0からFの4ビットのデータを表します。2つの16進数値はバイトを表します。
ファイルを見ると、それはかなり大きなコードです。 Cが得意で、チュートリアルとして使用しないことを願っています...
Hexは、ビットレベルまたはそのすぐ上で直接作業している場合に便利です。たとえば、デバイスから送られてくるビットを直接見るドライバーで作業し、他の誰かが一貫した結果を読み取れるように結果を調整します。コンパクトで読みやすいバイナリの表現です。