2011-07-02 16 views
6

ウィキペディア、知識の1つの本当の原因は、状態:最も古いマイクロプロセッサ上でビット単位の操作はまだ実用的ですか?

を、ビット単位 操作が 乗算、除算 操作よりもかなり速い通常 加減算 よりもわずかに速いです。現代のアーキテクチャでは、 これは当てはまりません:ビット単位で 操作は一般的に同じです 速度を追加(まだより速い 乗算よりも)です。

ビット単位の操作ハックを学習する実用的な理由はありますか、それは今理論と好奇心のために学ぶものですか?

+1

wikipedia "真の知識源"?それは少し誇張されているようです... – ShinTakezou

+11

@ShinTakezou:それは皮肉と呼ばれています。 – geekosaur

+1

ウィキペディアが本当に素晴らしい知識源であり、常に正しいと思う人を知っているので、私は主張が誇張されていると主張している点を除いて、それは皮肉だという事実についての手がかりを得ることはできません。 OPの実際の意見とPoVについて知っているわけではないので、私は主張を真剣に受けなければなりません。それが皮肉であることを知ってうれしい。 – ShinTakezou

答えて

12

多くのアプリケーションがあるため、ビット単位の操作は検討する価値があります。 ではなく、であり、算術演算を代入する主な用途です。暗号化、コンピュータグラフィックス、ハッシュ関数、圧縮アルゴリズム、およびネットワークプロトコルは、ビット単位の操作が非常に有用な例です。

Wikipediaの記事から引用された行は、ビット単位の操作の速度に関するいくつかの手がかりを与えようとしました。残念なことに、この記事ではアプリケーションの良い例をいくつか挙げていません。

4

バイナリの仕組みを理解するのに便利です。そうでなければ、いいえ。実際、私はビットワイズハックが特定のアーキテクチャー上で高速であっても、あなたのものではなく、その事実を利用するのはコンパイラーの仕事だと言います。あなたが意味することを書いてください。

+0

+1 "これはコンパイラの仕事です。"それは、時にはあなたが意味することは、さまざまなフラグが設定されているかどうかを調べるための値を含むビットマスクをまとめたものです。 –

+0

@Sherm:確かに - でも、加算や減算を「意味する」わけではないので、ビット単位の操作は意味的に正しいものです(そして、やり方はコンパイラの仕事です)。 – geekosaur

+1

プラットフォームや言語によっては、コードが常にコンパイルされるとは限りませんので、パフォーマンスが依然として問題であれば、ビット単位の操作がわかりやすく便利です。 – ricosrealm

1

もちろん(私にとっては)答えは「はい」です。実際にadd命令がorまたはandと同じ速さであるということは、そのことを意味するだけですが、oraddではありません。とにかく必要なときに使用します(合計するのではなく、orを実行するだけです)。 、...)。加算、除算などの命令の速度が向上したことは、これを使用してパフォーマンスの影響をあまり懸念する必要がなくなったことを意味しますが、これまではaddをいくつかのビットごとに変更しないオペレーション!

1

実際に数字をビットベクトルとして使用している場合は、使用することが理にかなっています。たとえば、ある種のハードウェアをモデリングしていて、変数がレジスタを表しているとします。

算術演算を実行する場合は、算術演算子を使用します。

1

問題の内容によって異なります。ハードウェアを制御している場合は、単一ビットを整数に設定する方法が必要です。

OGD1 PCIボード(オープングラフィックスカード)を購入し、libpciを使用してそのカードと話してください。 http://en.wikipedia.org/wiki/Open_Graphics_Project

11

ビット単位の操作は依然として有効です。たとえば、単一の変数を使用して「フラグ」を作成し、さまざまな条件を示すために使用する変数の数を保存するために使用できます。算術演算のパフォーマンスに関しては、コンパイラに最適化を任せておく方が良いです(あなたが何らかの専門家でなければ)。

+0

これは別の便利な使い方です。 – ricosrealm

+2

+1これをフラグとして使用する場合は、 – CamelCamelCamel

+0

プロトコルやハードウェア構成のようなものや、コードのメモリ帯域幅要件を大幅に削減できるため、操作サイクル数よりもはるかに大きなパフォーマンス改善の可能性があります。 –

1

ほとんどの場合、定数に2の累乗を掛けると、コンパイラはビットシフトを使用するように最適化します。ただし、シフトも変数である場合、明示的にシフト操作を使用しない限り、コンパイラはそれを差し引くことはできません。

+0

True。一方、いくつかのプロセッサは、可変量のビットによるシフトを実行できるよりも速く乗算する。読みやすいものを書いてください。あなたのコードの重要な10%はとにかくどこかにある可能性があります... –

0

IPv4アドレスを使用する作業では、ピアのアドレスがルーティング可能なネットワーク内にあるかどうか、またはゲートウェイに転送する必要があるかどうかを検出する必要が頻繁にあります。ビット操作は、ネットワークのブロードキャストアドレスを発見するために必要です。

IPv6アドレスの操作には同じ基本ビットレベル操作が必要ですが、長すぎるため、実装方法がわかりません。私は彼らが依然としてアーキテクチャのために適切なデータの個ののビット演算子を使用して実装されているお金を賭けるだろう。

1

C/C++のctype []配列について言えば、誰も見たことがない人は誰も見かけませんでした。このコンセプトは、特に異なるアルファベットを使用する場合や、文章を解析する場合に、言語処理に非常に役立ちます。

ctype []は256個の短い整数の配列であり、各整数には異なる文字型を表すビットがあります。たとえば、ctype [; A '] - ctype [' Z ']は、アルファベットの大文字であることを示すビットを設定します。 ctype ['0'] - ctype ['9']ビットが数値であることを示すように設定されています。文字xが英数字であるかどうかを調べるには、 'if(' A '= x <)よりもやや速くエレガントなif(ctype [x] &(UC | LC | NUM) = 'Z' || .... '。

ビット単位の考え方を始めると、それを使用する場所がたくさんあります。たとえば、2つのテキストバッファがあり、1つを書き込み、すべての文字列を置き換えます私が行ったときにREPLACEstringを使ってFINDstringを実行した後、次の検索置換ペアのためにバッファインデックスを切り替えただけなので、バッファ[in]からバッファ[out]コピーを完了した後、私は単に「in^= 1; out^= 1;」と書きました。すべての置換えを処理した後、私はバッファに[out]を書きました。時間。

これが低レベルだと思うなら、deja-vuやtwin jamais-vuなどの特定の精神的エラーは脳のビットエラーによって引き起こされると考えてください!

関連する問題