63

おい!私はhttp://www.gnu.org/software/m68hc11/examples/primes_8c-source.htmlでこのコードを見ていました

134行目のように、状況によっては16進数を使用していることに気づきました。

for (j = 1; val && j <= 0x80; j <<= 1, q++)

では、なぜ彼らは0x80を使用するのでしょうか。私は16進数があまり得意ではありませんが、オンラインの16進数から10進数を見つけたので、0x80で128になりました。

また、134行目の前の114行目には次のようなものがあります。

small_n = (n & 0xffff0000) == 0;

16進数から10進数では、その16進数に対して4294901760が得られました。したがって、この行では、彼らは少しANDを作成し、結果を0と比較していますか?

数字だけを使ってみませんか?誰か説明してもらえますか、他の状況の例を挙げてください。

また、16進数だけの大きなコード行を見たことがありますが、その理由がよくわかりません:(

4

12 に答える 12

106

どちらの場合も、実際の数値ではなく、数値のビット パターンが重要です。

たとえば、最初のケースで jは、ループが進行するにつれて 1 になり、次に 2、4、8、16、32、64、最後に 128 になります。

バイナリでは、つまり、

0000:00010000:00100000:01000000:10000001:0000、および。0010:0000_0100:00001000:0000

C (C23 まで) または C++ (C++14 まで) にはバイナリ定数のオプションはありませんが、16 進数では少し明確です: 0x010x020x040x080x100x200x40および0x80.

2 番目の例では、値の下位 2 バイトを削除することが目標でした。したがって、値が 1,234,567,890 の場合、最終的には 1,234,567,168 になります。
16 進数では、より明確です: で始まり、0x4996:02d2で終わり0x4996:0000ます。

于 2008-10-28T15:25:02.860 に答える
19

そのビットマスク。16 進数値を使用すると、基になるバイナリ表現を簡単に確認できます。n &は n0xffff0000の上位 16 ビットを返します。0xffff0000「バイナリで16個の1と16個の0」を意味します

0x80「1000000」を意味するので、「00000001」から始めて、「0000010」、「0000100」など、「1000000」までそのビットを左にシフトし続けます。

于 2008-10-28T15:25:49.643 に答える
18

16 進数 (さらに言えば 8 進数) の数字と基になるビット パターンとの間には直接のマッピングがありますが、10 進数には当てはまりません。10 進数の '9' は、それがどの列にあり、どの数字がそれを囲んでいるかに応じて、ビット パターンに関して異なる何かを表します。ビット パターンと直接的な関係はありません。16 進数では、「9」は常に「1001」を意味します。9 = '1001'、95 = '*1001*0101' など。

私の8ビット時代の痕跡として、16進数はバイナリの便利な省略形であることがわかりました。ビットいじりは死にゆくスキルです。一度 (約 10 年前)、大学で 3 年生のネットワーキングに関する論文を見たことがあります。そこでは、クラスの 10% (50 人中 5 人程度) しかビットマスクを計算できませんでした。

于 2008-10-28T15:37:44.330 に答える
16

0xffff0000 は 32 ビット値で 16 回の「1」と 16 回の「0」であり、4294901760 は魔法です。

于 2008-10-28T15:26:08.490 に答える
11

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)

これにより、特定のビットレベルのコードが読みやすくなることがあります。

于 2008-10-28T16:51:09.457 に答える
7

16 進数の最大の用途は、おそらく組み込みプログラミングです。16 進数は、ハードウェア レジスタの個々のビットをマスクするか、複数の数値を 1 つの 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...
于 2008-10-28T17:06:34.370 に答える
6

HEX での値の視覚的表現により、コードがより読みやすく、理解しやすくなる場合があります。たとえば、数値の 10 進数表現を見ると、ビットマスキングやビットの使用がわかりにくくなります。

これは、特定の値の型が提供する必要があるスペースの量に関係する場合があるため、それも役割を果たす可能性があります。

典型的な例は 2 進数の設定である可能性があるため、一部の値を示すために 10 進数を使用する代わりに、2 進数を使用します。

オブジェクトに、on または off のいずれかの値 (そのうち 3 つ) を持つ非排他的なプロパティ セットがあるとします。これらのプロパティの状態を表す 1 つの方法は、3 ビットを使用することです。

有効な表現は 10 進数で 0 から 7 ですが、それはそれほど明白ではありません。より明白なのは、バイナリ表現です。

000、001、010、011、100、101、110、111

また、16 進数に非常に慣れている人もいます。また、ハードコードされたマジック ナンバーはそれだけであり、使用する番号付けシステムに関係なく、それほど重要ではないことにも注意してください。

それが役立つことを願っています。

于 2008-10-28T15:29:35.160 に答える
6

一般に、10 進数の代わりに 16 進数を使用するのは、コンピューターがビット (2 進数) を処理するためであり、ビットを処理する場合も 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 進数から 2 進数に渡す方がはるかに簡単です。

于 2008-10-28T15:40:58.037 に答える
4

1 バイトには 8 ビットがあります。基数 16 の 16 進数は簡潔です。可能なバイト値は、コレクション 0..9 の 2 文字と a、b、c、d、e、f を使用して表現されます。

Base 256 はより簡潔になります。考えられるすべてのバイトは独自の 1 文字を持つことができますが、ほとんどの人間の言語は 256 文字を使用しないため、Hex が勝者です。

簡潔であることの重要性を理解するには、1970 年代にさかのぼって、メガバイトのメモリを調べたいときに、16 進数で出力されていたことを考えてみてください。プリントアウトには、数千ページの大きな紙が必要です。Octal は、さらに多くの木を無駄にしていたでしょう。

于 2008-10-29T23:52:10.277 に答える
4

16 進数または 16 進数は、0 ~ 15 または 16 進数 0 ~ F の 4 ビットのデータを表します。2 つの 16 進数値は 1 バイトを表します。

于 2008-10-28T15:26:05.150 に答える
3

より正確に言うと、16 進数と 10 進数はすべて NUMBERS です。基数 (基数 10、16 など) は、これらの数値をより明確に、またはより便利な方法で表示する方法です。

「何かがいくつあるか」を議論するとき、通常は小数を使用します。コンピュータでアドレスやビット パターンを調べる場合、通常は 16 進数が好まれます。これは、多くの場合、個々のバイトの意味が重要になる可能性があるためです。

16 進数 (および 8 進数) は 2 の累乗であるという特性を持っているため、ビットのグループを適切にマッピングします。16 進数は 4 ビットを 1 つの 16 進数ニブル (0 ~ F) にマップするため、1 バイトは 2 つのニブル (00 ~ FF) に格納されます。8 進数は、デジタル機器 (DEC) やその他の古いマシンで一般的でしたが、1 桁の 8 進数が 3 ビットにマップされるため、バイト境界をうまく超えません。

全体として、基数の選択はプログラミングを容易にする方法です。ドメインに最もよく一致する基数を使用してください。

于 2008-10-28T18:05:29.010 に答える
2

ファイルを見ると、それはかなりグロディなコードです。Cが得意で、チュートリアルとして使用していないことを願っています...

16 進数は、ビット レベルまたはそのすぐ上で直接作業している場合に便利です。たとえば、デバイスから入ってくるビットを直接見て、他の誰かが首尾一貫した結果を読み取れるように結果をいじるドライバーで作業します。これは、バイナリのコンパクトで読みやすい表現です。

于 2008-10-28T15:36:56.300 に答える