fork download
  1. #include <ctime>
  2. #include <iostream>
  3.  
  4. // テスト用のmix(この関数は遅いよ!これより早いの作ってね!)
  5. uint32_t mix_test(uint16_t a, uint16_t b) {
  6. uint32_t o = 0;
  7. for (int i = 0; i < 16; i++) {
  8. if (a & (1 << i)) o |= 1 << (i * 2 + 0);
  9. if (b & (1 << i)) o |= 1 << (i * 2 + 1);
  10. }
  11. return o;
  12. }
  13.  
  14. // mixはaとbのbitを交互に詰めて返す。aが下位に来る。
  15. // (例)
  16. // a : 1111111111111111
  17. // b : 0000000000000000
  18. // o : 01010101010101010101010101010101
  19. uint32_t mix1(uint16_t a, uint16_t b) {
  20. // uint32_t a = a16;
  21. // uint32_t b = b16;
  22.  
  23. return
  24. (a & 0b1) << 0 | (a & 0b10) << 1| (a & 0b100) << 2| (a & 0b1000) << 3| (a & 0b10000) << 4| (a & 0b100000) << 5| (a & 0b1000000) << 6| (a & 0b10000000) << 7| (a & 0b100000000) << 8| (a & 0b1000000000) << 9| (a & 0b10000000000) << 10| (a & 0b100000000000) << 11| (a & 0b1000000000000) << 12| (a & 0b10000000000000) << 13| (a & 0b100000000000000) << 14| (a & 0b1000000000000000) << 15
  25. |(b & 0b1) << 1 | (b & 0b10) << 2| (b & 0b100) << 3| (b & 0b1000) << 4| (b & 0b10000) << 5| (b & 0b100000) << 6| (b & 0b1000000) << 7| (b & 0b10000000) << 8| (b & 0b100000000) << 9| (b & 0b1000000000) << 10| (b & 0b10000000000) << 11| (b & 0b100000000000) << 12| (b & 0b1000000000000) << 13| (b & 0b10000000000000) << 14| (b & 0b100000000000000) << 15| (b & 0b1000000000000000) << 16;
  26. }
  27.  
  28. // テスト
  29. void test(uint32_t(*func)(uint16_t, uint16_t)) {
  30. std::cout << "test...";
  31. for (int i = 0; i < 100; i++) {
  32. uint16_t a = rand(), b = rand();
  33. if (func(a, b) != mix_test(a, b)) {
  34. std::cout << "failed" << std::endl;
  35. exit(EXIT_FAILURE);
  36. }
  37. }
  38. std::cout << "passed!" << std::endl;
  39. }
  40.  
  41. // ベンチマーク
  42. void benchmark(uint32_t (*func)(uint16_t, uint16_t)) {
  43. std::cout << "benchmark...";
  44. uint32_t dammy = 0;
  45. double start = clock();
  46. for (int i = 0; i < 50000000; i++) dammy ^= func(rand(), rand());
  47. double end = clock();
  48. std::cout << "end! elapsed:" << (end - start) / CLOCKS_PER_SEC << "s " << dammy << std::endl;
  49. }
  50.  
  51. int main() {
  52. test(mix1);
  53. benchmark(mix1);
  54. return 0;
  55. }
Success #stdin #stdout 1.68s 5312KB
stdin
Standard input is empty
stdout
test...passed!
benchmark...end! elapsed:1.67465s 4192649710