4

「A、B、および C がすべて D に等しい場合」の略記はありますか? 私が現在いるシナリオでは、実際の値ではなく、すべてが等しいかどうかを確認することにのみ関心があるため、「A、B、C、および D が同じ場合」の何かも機能します。

4

6 に答える 6

2

これが速度制限になる可能性が高いシナリオに遭遇する可能性はほとんどありません。ただし、多くの場合、ループ内のブランチを最小化するのが最も高速です。

Id do

!(a^b | b^c | c^d)

少なくともループが実行されるたびに結果が同じでない場合は、ビット演算子がワイルドプラサーの回答|の短絡よりも高速になると思いますが、想定しないでください。||それが実際に重要な場合は、両方を試して測定してください。

かなり短い構文ですが

于 2013-02-03T23:57:31.917 に答える
2

質問は C としてタグ付けされていますが、C++11 が許可されている場合はall_equal、次のように定義できます。

template <typename T1>
inline bool all_equal(T1&& val) {
 return true;
}

template <typename T1, typename T2, typename... Ts>
inline bool all_equal(T1&& val1, T2&& val2, Ts&&... rest) {
  return val1 == val2 && all_equal(std::forward<T2>(val2), std::forward<Ts>(rest)...);
}

使用例:

all_equal(3);    // true
all_equal(3, 3); // true
all_equal(3, 4); // false
all_equal(x, y, z); // would be expanded to 'x == y && y == z'

引数の数に制限はありません。

C に固執したい場合は、可変長の引数リストを使用できますが、お勧めしません。

于 2013-02-03T23:39:17.703 に答える
1

短絡的な XOR トリック:

int abcd(unsigned aa, unsigned bb, unsigned cc, unsigned dd)
{
#define FOUR_UNEQUAL(a,b,c,d)  ((a^b^c^d) || (a^b) || (c^d) || (b^c)) ? 1 : 0

return FOUR_UNEQUAL(aa,bb,cc,dd);
}

生成されたアセンブリ (GCC 4.6.1-9ubuntu3):

type   abcd, @function
abcd:
.LFB23:
        .cfi_startproc
        movl    %esi, %eax
        xorl    %edi, %eax
        xorl    %edx, %eax
        cmpl    %ecx, %eax
        jne     .L7
        cmpl    %esi, %edi
        jne     .L7
        cmpl    %ecx, %edx
        setne   %al
        cmpl    %edx, %esi
        setne   %dl
        orl     %edx, %eax
        movzbl  %al, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L7:
        movl    $1, %eax
        ret
        .cfi_endproc

そして、前述のように、速度の向上はわずかです (あるとしても)。

于 2013-02-03T23:14:21.963 に答える
0

おそらく、「最も速い」方法は、ペアを比較してから、ペアの結果を確認することです (A == B) && (C == D) && (A == C)。実際にOPで示されているように。より多くの要素、作業ペア、および結果の結合については、完全なバイナリ ツリーを作成します。&&平均してできるだけ早く失敗するように、並べ替えまで行う可能性があります。いずれにせよ、これは非常に特殊な操作なので (そのようなことをしたことがあるかどうかはすぐには思い出せません)、これに余分な記法を提供すると、得られるものよりも多くの損害を被る可能性があります。

いつものように、最初に最も読みやすいコードを書き、測定値が価値があることを示す場合はパフォーマンスをマッサージします。人間の時間 (コードの作成、デバッグ、保守) は、非常にまれな場合を除いて、コンピューターの実行時間よりもはるかに価値があります。

于 2013-02-04T00:20:37.680 に答える
0

それを行うマクロを定義できます。

#DEFINE ARE_ALL_EQUALS(A, B, C, D) (((A) == (B)) && ((B) == (C)) && ((C) == (D)))

ただし、B と C の多重評価には注意してください。

于 2013-02-03T23:06:34.253 に答える
0

次のようなマクロを定義できます

#define ALL_EQUAL(A, B, C, D) ((A) == (B)) && ((B) == (C)) && ((C) == (D))

しかし、通常のものよりも利点が見られません。

于 2013-02-03T23:08:13.057 に答える