私はこれについて話している:
10進数で77、16進数で4Dの文字「A」がある場合。Dを取得する最速の方法を探しています。
私は2つの方法について考えました:
与えられたxはバイトです。
x << 4; x >> 4
x %= 16
他の方法はありますか?どちらが速いですか?
私はこれについて話している:
10進数で77、16進数で4Dの文字「A」がある場合。Dを取得する最速の方法を探しています。
私は2つの方法について考えました:
与えられたxはバイトです。
x << 4; x >> 4
x %= 16
他の方法はありますか?どちらが速いですか?
簡潔さは素晴らしいです-説明はより良いです:)
x &= 0x0f
もちろん、正しい答えです。これは、達成しようとしていることの意図を正確に表しており、適切なアーキテクチャでは、常に最小数の命令(つまり、1)にコンパイルされます。ビット演算子に定数を入れるときは常に、10進数ではなく16進数を使用してください。
x <<= 4; x >>= 4
'byte'が適切な符号なし型である場合にのみ機能します。それが実際に符号付き文字である場合、2番目の操作によって符号拡張が発生する可能性があります(つまり、元のビット3がビット4〜7にも表示されます)。
最適化しない場合、これはもちろん2つの命令を必要としますが、OSX上のGCCを
-O1
使用すると、これを最初の答えに減らすことさえできます。
x %= 16
オプティマイザが有効になっていない場合でも、コンパイラはほぼ確実にここで正しいことを行い、その高価なdiv/mod演算を最初の答えに変えます。ただし、それは2の累乗に対してのみ実行でき、このパラダイムでは、達成しようとしていることをそれほど明確にすることはできません。
私はいつも使っていますx &= 0x0f
多くの良い答えがあり、それらのいくつかは技術的に正しいものです。
より広いスケールでは、C /C++はアセンブラーではないことを理解する必要があります。プログラマーの仕事は、あなたが何を達成したいのかという意図をコンパイラーに伝えようとすることです。コンパイラーは、アーキテクチャーとさまざまな最適化フラグに応じて、それを行うための最良の方法を選択します。
x&= 0x0F; 何を達成したいかをコンパイラに伝える最も明確な方法です。一部のアーキテクチャで上下にシフトする方が速い場合、それを認識して正しいことを行うのはコンパイラの仕事です。
単一のAND操作で実行できます。
x = (x & 0x0F);
アーキテクチャにある程度依存します(ARMでシフトアップおよびシフトダウンするのがおそらく最速の方法です)が、コンパイラがそれを行う必要があります。実際、提案されたすべてのメソッドは、コンパイラによって同じコードに最適化される可能性があります。
x = x & 15