#include <iostream>
#include <time.h>
#include <inttypes.h>
#include <stdlib.h>
using namespace std;
const clockid_t TIMER = CLOCK_MONOTONIC_RAW;
const unsigned int N = 1024 * 128, M = 4096;
static uint8_t tbl[256], src[M + N];
static uint8_t f(uint8_t x)
{
return (x & 1) | ((x >> 1) & 2) | ((x >> 2) & 4) | ((x >> 3) & 8);
}
void fill_tbl()
{
for (unsigned i = 0; i < 256; i++)
tbl[i] = f(i);
}
void fill_src()
{
for (unsigned i = 0; i < N + M; i++)
src[i] = rand() & 255;
}
uint8_t test0(unsigned int n, const uint8_t *src)
{
uint8_t res = 0;
for (unsigned i = 0; i < n; i++)
res ^= f(src[i]);
return res;
}
uint8_t test1(unsigned int n, const uint8_t *src)
{
uint8_t res = 0;
for (unsigned i = 0; i < n; i++)
res ^= tbl[src[i]];
return res;
}
int main()
{
struct timespec tp0, tp1;
double dt;
unsigned int res;
fill_tbl();
fill_src();
clock_gettime(TIMER, &tp0);
test0(M, src);
res = 0;
for (unsigned int i = 0; i < N; i++)
res += test0(M, src + i);
clock_gettime(TIMER, &tp1);
dt = (tp1.tv_sec - tp0.tv_sec) + 1e-9 * (tp1.tv_nsec - tp0.tv_nsec);
cout << res << " " << dt << endl;
clock_gettime(TIMER, &tp0);
test1(M, src);
res = 0;
for (unsigned int i = 0; i < N; i++)
res += test1(M, src + i);
clock_gettime(TIMER, &tp1);
dt = (tp1.tv_sec - tp0.tv_sec) + 1e-9 * (tp1.tv_nsec - tp0.tv_nsec);
cout << res << " " << dt << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgY2xvY2tpZF90IFRJTUVSID0gQ0xPQ0tfTU9OT1RPTklDX1JBVzsKY29uc3QgdW5zaWduZWQgaW50IE4gPSAxMDI0ICogMTI4LCBNID0gNDA5NjsKCnN0YXRpYyB1aW50OF90IHRibFsyNTZdLCBzcmNbTSArIE5dOwoKc3RhdGljIHVpbnQ4X3QgZih1aW50OF90IHgpCnsKCXJldHVybiAoeCAmIDEpIHwgKCh4ID4+IDEpICYgMikgfCAoKHggPj4gMikgJiA0KSB8ICgoeCA+PiAzKSAmIDgpOwp9Cgp2b2lkIGZpbGxfdGJsKCkKewoJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDI1NjsgaSsrKQoJCXRibFtpXSA9IGYoaSk7Cn0KCnZvaWQgZmlsbF9zcmMoKQp7Cglmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTiArIE07IGkrKykKCQlzcmNbaV0gPSByYW5kKCkgJiAyNTU7Cn0KCnVpbnQ4X3QgdGVzdDAodW5zaWduZWQgaW50IG4sIGNvbnN0IHVpbnQ4X3QgKnNyYykKewoJdWludDhfdCByZXMgPSAwOwoJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG47IGkrKykKCQlyZXMgXj0gZihzcmNbaV0pOwoJcmV0dXJuIHJlczsKfQoKdWludDhfdCB0ZXN0MSh1bnNpZ25lZCBpbnQgbiwgY29uc3QgdWludDhfdCAqc3JjKQp7Cgl1aW50OF90IHJlcyA9IDA7Cglmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsgaSsrKQoJCXJlcyBePSB0Ymxbc3JjW2ldXTsKCXJldHVybiByZXM7Cn0KCgppbnQgbWFpbigpIAp7CglzdHJ1Y3QgdGltZXNwZWMgdHAwLCB0cDE7Cglkb3VibGUgZHQ7Cgl1bnNpZ25lZCBpbnQgcmVzOwoJZmlsbF90YmwoKTsKCWZpbGxfc3JjKCk7CgoJY2xvY2tfZ2V0dGltZShUSU1FUiwgJnRwMCk7Cgl0ZXN0MChNLCBzcmMpOwoJcmVzID0gMDsKCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTjsgaSsrKQoJCXJlcyArPSB0ZXN0MChNLCBzcmMgKyBpKTsKCWNsb2NrX2dldHRpbWUoVElNRVIsICZ0cDEpOwoJZHQgPSAodHAxLnR2X3NlYyAtIHRwMC50dl9zZWMpICsgMWUtOSAqICh0cDEudHZfbnNlYyAtIHRwMC50dl9uc2VjKTsKCWNvdXQgPDwgcmVzIDw8ICAiICAiIDw8IGR0IDw8IGVuZGw7CgoJY2xvY2tfZ2V0dGltZShUSU1FUiwgJnRwMCk7Cgl0ZXN0MShNLCBzcmMpOwoJcmVzID0gMDsKCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTjsgaSsrKQoJCXJlcyArPSB0ZXN0MShNLCBzcmMgKyBpKTsKCWNsb2NrX2dldHRpbWUoVElNRVIsICZ0cDEpOwoJZHQgPSAodHAxLnR2X3NlYyAtIHRwMC50dl9zZWMpICsgMWUtOSAqICh0cDEudHZfbnNlYyAtIHRwMC50dl9uc2VjKTsKCWNvdXQgPDwgcmVzIDw8ICIgICIgPDwgZHQgPDwgZW5kbDsKCglyZXR1cm4gMDsKfQo=