Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <assert.h>
- #include <stdint.h>
- /*
- C function to calculate the truncated square root of an integer <= 65535 without
- any loops or if-statements.
- Gary Williams 2018-10-31
- https://pastebin.com/DRBW7GD2
- 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
- */
- uint8_t isqrt_16d(uint16_t v) {
- uint8_t result = 0;
- result ^= 1 << 7;
- result ^= ((uint32_t)(v - result * result) >> 31) << 7;
- result ^= 1 << 6;
- result ^= ((uint32_t)(v - result * result) >> 31) << 6;
- result ^= 1 << 5;
- result ^= ((uint32_t)(v - result * result) >> 31) << 5;
- result ^= 1 << 4;
- result ^= ((uint32_t)(v - result * result) >> 31) << 4;
- result ^= 1 << 3;
- result ^= ((uint32_t)(v - result * result) >> 31) << 3;
- result ^= 1 << 2;
- result ^= ((uint32_t)(v - result * result) >> 31) << 2;
- result ^= 1 << 1;
- result ^= ((uint32_t)(v - result * result) >> 31) << 1;
- result ^= 1 << 0;
- result ^= ((uint32_t)(v - result * result) >> 31) << 0;
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement