Advertisement
Chris_M_Thomasson

RIFC in 2-ary, unsigned integers

May 24th, 2020
1,488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. // RIFC in binary, or 2-ary if you will
  2.  
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6.  
  7. namespace ct_rifc
  8. {
  9.     unsigned long store(unsigned long x)
  10.     {
  11.         unsigned long i = 0;
  12.         unsigned long v = 0;
  13.         unsigned long tree_val = 0;
  14.  
  15.         for (i = 0; v != x; ++i)
  16.         {
  17.             unsigned long bit = ((x >> i) % 2);
  18.  
  19.             v += bit * std::pow(2, i);
  20.  
  21.             unsigned long child_left = tree_val * 2 + 1;
  22.             unsigned long child_right = tree_val * 2 + 2;
  23.  
  24.             if (bit == 0)
  25.             {
  26.                 // left
  27.                 //std::cout << "store left\n";
  28.                 tree_val = child_left;
  29.             }
  30.  
  31.             else
  32.             {
  33.                 // right
  34.                 //std::cout << "store right\n";
  35.                 tree_val = child_right;
  36.             }
  37.  
  38.             //std::cout << "bit = " << bit << "\n";
  39.             //std::cout << "v = " << v << "\n";
  40.             //std::cout << "tree_val = " << tree_val << "\n\n";
  41.         }
  42.  
  43.         return tree_val / 2;
  44.     }
  45.  
  46.  
  47.     unsigned long load(unsigned long x)
  48.     {
  49.         x = x * 2;
  50.  
  51.         unsigned long x_tmp = x;
  52.         unsigned long v = 0;
  53.         unsigned long levels = 0;
  54.  
  55.         for (levels = 0; x_tmp != 0; ++levels)
  56.         {
  57.             x_tmp = (x_tmp - 1) / 2;
  58.         }
  59.  
  60.         for (unsigned long i = 0; x != 0; ++i)
  61.         {
  62.             unsigned long parent = (x - 1) / 2;
  63.  
  64.             unsigned long child_left = parent * 2 + 1;
  65.             unsigned long child_right = parent * 2 + 2;
  66.  
  67.             if (x == child_left)
  68.             {
  69.                 // std::cout << "load left\n";
  70.                 //v += 0 * std::pow(2, levels - i - 1); // mul by zero, nothing.
  71.             }
  72.  
  73.             else
  74.             {
  75.                 //std::cout << "load right\n";
  76.                 v += 1 * std::pow(2, levels - i - 1);
  77.             }
  78.  
  79.             x = parent;
  80.         }
  81.  
  82.         return v;
  83.     }
  84.  
  85.  
  86.     void test()
  87.     {
  88.         for (unsigned long i = 0; i < 256; ++i)
  89.         {
  90.             unsigned long plaintext = i;
  91.  
  92.             unsigned long ciphertext = store(plaintext);
  93.  
  94.             unsigned long decrypted = load(ciphertext);
  95.  
  96.             //std::cout << "plaintext = " << plaintext << "\n";
  97.             //std::cout << "ciphertext = " << ciphertext << "\n";
  98.             //std::cout << "decrypted = " << decrypted << "\n";
  99.  
  100.             std::cout << "(pt, ct, dt) = " <<
  101.                 plaintext << ", " << ciphertext << ", " << decrypted << "\n";
  102.  
  103.             //std::cout << "\n";
  104.  
  105.             if (plaintext != decrypted)
  106.             {
  107.                 std::cout << "FAILURE!\n";
  108.                 break;
  109.             }
  110.         }
  111.     }
  112. }
  113.  
  114.  
  115. int main()
  116. {
  117.     {
  118.         ct_rifc::test();
  119.  
  120.         std::cout << "\n\nFIN!\n";
  121.     }
  122.  
  123.     //std::cin.get();
  124.  
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement