Advertisement
Ewwe

DO64

Aug 25th, 2016
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 2.70 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. // A bit array could save memory but would be slower...
  4.  
  5. #define Int64:: \
  6.     Int64_
  7.  
  8. #define long<%0> \
  9.     %0[2]
  10.  
  11. //Shitty syntax
  12. static stock long <Int64::Result>;
  13.  
  14. /*
  15.  * Arithmetic Operations:
  16.  * - Addition
  17.  * - Subtracion
  18.  * - Multiplication (ToDo)
  19.  * - Division (ToDo)
  20.  */
  21.  
  22. stock Int64::Add (long <a>, long <b>, bool: carryin = false)
  23. {
  24.     new
  25.         c = _: carryin,
  26.         s,
  27.         i;
  28.  
  29.     Int64::Result [0] = Int64::Result [1] = 0;
  30.  
  31.     for (new j = 1; j >= 0; --j)
  32.     {
  33.         s = (a [j] ^ b [j]);
  34.         for (i = 0; i < 32; ++i)
  35.         {
  36.             Int64::Result [j] |= ((s ^ (c << i)) & (1 << i));
  37.             c <<= i;
  38.             c = (((a [j] & b [j]) | (a [j] & c) | (b [j] & c)) >> i) & 1;
  39.         }
  40.     }
  41.     return Int64::Result;
  42. }
  43.  
  44. stock Int64::Sub (long <a>, long <b>)
  45. {
  46.     Int64::Result = Int64::Add (a, Int64::NOT (b), true);
  47.     return Int64::Result;
  48. }
  49.  
  50. /*
  51.  * Logical Operations:
  52.  * - NOT
  53.  * - AND
  54.  * - OR
  55.  * - XOR
  56.  * - NAND
  57.  * - NOR
  58.  * - XNOR
  59.  */
  60.  
  61. stock Int64::NOT (long <a>)
  62. {
  63.     Int64::Result [0] = ~a [0];
  64.     Int64::Result [1] = ~a [1];
  65.  
  66.     return Int64::Result;
  67. }
  68.  
  69. stock Int64::AND (long <a>, long <b>)
  70. {
  71.     Int64::Result [0] = a [0] & b [0];
  72.     Int64::Result [1] = a [1] & b [1];
  73.  
  74.     return Int64::Result;
  75. }
  76.  
  77. stock Int64::OR (long <a>, long <b>)
  78. {
  79.     Int64::Result [0] = a [0] | b [0];
  80.     Int64::Result [1] = a [1] | b [1];
  81.  
  82.     return Int64::Result;
  83. }
  84.  
  85. stock Int64::XOR (long <a>, long <b>)
  86. {
  87.     Int64::Result [0] = a [0] ^ b [0];
  88.     Int64::Result [1] = a [1] ^ b [1];
  89.  
  90.     return Int64::Result;
  91. }
  92.  
  93. stock Int64::NAND (long <a>, long <b>)
  94. {
  95.     Int64::Result [0] = ~(a [0] & b [0]);
  96.     Int64::Result [1] = ~(a [1] & b [1]);
  97.  
  98.     return Int64::Result;
  99. }
  100.  
  101. stock Int64::NOR (long <a>, long <b>)
  102. {
  103.     Int64::Result [0] = ~(a [0] | b [0]);
  104.     Int64::Result [1] = ~(a [1] | b [1]);
  105.  
  106.     return Int64::Result;
  107. }
  108.  
  109. stock Int64::XNOR (long <a>, long <b>)
  110. {
  111.     Int64::Result [0] = ~(a [0] ^ b [0]);
  112.     Int64::Result [1] = ~(a [1] ^ b [1]);
  113.  
  114.     return Int64::Result;
  115. }
  116.  
  117. /*
  118.  * Misc. Operations:
  119.  * - ToString
  120.  * - Equal
  121.  * - Less
  122.  * - Greater
  123.  */
  124.  
  125. stock bool: Int64::Equal (long <a>, long <b>)
  126. {
  127.     Int64::Result = Int64::XNOR (a, b);
  128.     return (!Int64::Result [0] && !Int64::Result [1]);
  129. }
  130.  
  131. stock bool: Int64::Less (long <a>, long <b>)
  132. {
  133.     Int64::Result = Int64::Sub (a, b);
  134.     return bool: (Int64::Result [0] >>> 31); // Will be 1 or 0.
  135. }
  136.  
  137. stock bool: Int64::Greater (long <a>, long <b>)
  138. {
  139.     Int64::Result = Int64::Sub (b, a);
  140.     return bool: (Int64::Result [0] >>> 31); // Will be 1 or 0.
  141. }
  142.  
  143. stock Int64::ToString (long <a>)
  144. {
  145.     new
  146.         string [65],
  147.         i;
  148.  
  149.     for (new j = 0; j < 2; ++j)
  150.         for (i = 0; i < 32; ++i)
  151.             string [(32 * j) + i] = '0' + ((a [j] >> (31 - i)) & 1);
  152.  
  153.     return string;
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement