Advertisement
gwilliams

isqrt_challenge

Oct 31st, 2018
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <stdint.h>
  4.  
  5. /*
  6. C function to calculate the truncated square root of an integer <= 65535 without
  7. any loops or if-statements.
  8.  
  9. Gary Williams 2018-10-31
  10.  
  11. https://pastebin.com/DRBW7GD2
  12. https://www.quora.com/How-do-you-write-a-C-program-which-calculates-the-square-root-of-a-number-without-using-sqrt-function-neither-for-while-if-or-else-statements-nor-libraries
  13. */
  14. uint8_t isqrt_16d(uint16_t v) {
  15.     uint8_t result = 0;
  16.  
  17.     result ^= 1 << 7;
  18.     result ^= ((uint32_t)(v - result * result) >> 31) << 7;
  19.     result ^= 1 << 6;
  20.     result ^= ((uint32_t)(v - result * result) >> 31) << 6;
  21.     result ^= 1 << 5;
  22.     result ^= ((uint32_t)(v - result * result) >> 31) << 5;
  23.     result ^= 1 << 4;
  24.     result ^= ((uint32_t)(v - result * result) >> 31) << 4;
  25.     result ^= 1 << 3;
  26.     result ^= ((uint32_t)(v - result * result) >> 31) << 3;
  27.     result ^= 1 << 2;
  28.     result ^= ((uint32_t)(v - result * result) >> 31) << 2;
  29.     result ^= 1 << 1;
  30.     result ^= ((uint32_t)(v - result * result) >> 31) << 1;
  31.     result ^= 1 << 0;
  32.     result ^= ((uint32_t)(v - result * result) >> 31) << 0;
  33.  
  34.     return result;
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement