チャレンジ
値の範囲が0〜255の2つの整数を受け入れ、256を法とする整数の合計を返す関数を実装します。ビット単位の否定(〜)、ビット単位のOR(|)、ビットシフト演算子(>>、<<)のみを使用できます、および割り当て(=)。
使用できないものには次のものが含まれます(ただし、これらに限定されません)
- 加算、減算、乗算、除算
- ループ
- 条件文
- 関数呼び出し
バイナリまたはバイナリ否定、ビットシフト演算の使用回数が最も少ない。同点の場合、最も人気のあるソリューションが勝ちます。いつものように、標準の抜け穴が適用されます。
簡単な2ビット加算器の例を次に示します。77個のバイナリ否定、28個のバイナリor、および2ビットシフトを使用して合計スコア107を取得します(これは、Cプリプロセッサをで実行することで確認できますgcc -E
)。#define
sを削除し、結果の式を単純化することにより、はるかに効率的にすることができますが、わかりやすくするためにそれらを残しました。
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
更新:例の追加とスコア基準の変更