+
+c version (from paper linked from URL)
+
+unsigned squart(D, r) /*Non-Restoring sqrt*/
+ unsigned D; /*D:32-bit unsigned integer to be square rooted */
+ int *r;
+{
+ unsigned Q = 0; /*Q:16-bit unsigned integer (root)*/
+ int R = 0; /*R:17-bit integer (remainder)*/
+ int i;
+ for (i = 15;i>=0;i--) /*for each root bit*/
+ {
+ if (R>=0)
+ { /*new remainder:*/
+ R = R<<2)|((D>>(i+i))&3);
+ R = R-((Q<<2)|1); /*-Q01*/
+ }
+ else
+ { /*new remainder:*/
+ R = R<<2)|((D>>(i+i))&3);
+ R = R+((Q<<2)|3); /*+Q11*/
+ }
+ if (R>=0) Q = Q<<1)|1; /*new Q:*/
+ else Q = Q<<1)|0; /*new Q:*/
+ }
+
+ /*remainder adjusting*/
+ if (R<0) R = R+((Q<<1)|1);
+ *r = R; /*return remainder*/
+ return(Q); /*return root*/
+}
+
+From wikipedia page:
+
+short isqrt(short num) {
+ short res = 0;
+ short bit = 1 << 14; // The second-to-top bit is set: 1 << 30 for 32 bits
+
+ // "bit" starts at the highest power of four <= the argument.
+ while (bit > num)
+ bit >>= 2;
+
+ while (bit != 0) {
+ if (num >= res + bit) {
+ num -= res + bit;
+ res = (res >> 1) + bit;
+ }
+ else
+ res >>= 1;
+ bit >>= 2;
+ }
+ return res;
+}
+