110513Sdlw /* 222936Skre * Copyright (c) 1980 Regents of the University of California. 322936Skre * All rights reserved. The Berkeley software License Agreement 422936Skre * specifies the terms and conditions for redistribution. 522936Skre * 6*23778Sjerry * @(#)pow_hh.c 5.2 06/26/85 710513Sdlw */ 810513Sdlw 910513Sdlw short pow_hh(ap, bp) 1010513Sdlw short *ap, *bp; 1110513Sdlw { 12*23778Sjerry short int pow, x, n; 1310513Sdlw 14*23778Sjerry pow = 1; 15*23778Sjerry x = *ap; 16*23778Sjerry n = *bp; 1710513Sdlw 18*23778Sjerry if (n == 0) 19*23778Sjerry return ( 1L ); 20*23778Sjerry 21*23778Sjerry if (x == 0) 22*23778Sjerry { 23*23778Sjerry if( n > 0 ) 24*23778Sjerry return ( 0L ); 25*23778Sjerry else 26*23778Sjerry return ( 1/x ); 27*23778Sjerry } 28*23778Sjerry 29*23778Sjerry if (x == 1) 30*23778Sjerry return ( 1L ); 31*23778Sjerry 32*23778Sjerry if (x == -1) 33*23778Sjerry { 34*23778Sjerry if (n < 0) 3510513Sdlw { 36*23778Sjerry if (n < -2) 37*23778Sjerry n += 2; 38*23778Sjerry n = -n; 39*23778Sjerry } 40*23778Sjerry if (n % 2 == 0) 41*23778Sjerry return ( 1L ); 4210513Sdlw else 43*23778Sjerry return ( -1L ); 44*23778Sjerry } 45*23778Sjerry 46*23778Sjerry if (n > 0) 47*23778Sjerry for( ; ; ) 48*23778Sjerry { 49*23778Sjerry if(n & 01) 50*23778Sjerry pow *= x; 51*23778Sjerry if(n >>= 1) 52*23778Sjerry x *= x; 53*23778Sjerry else 54*23778Sjerry break; 5510513Sdlw } 56*23778Sjerry else 57*23778Sjerry pow = 0; 58*23778Sjerry 59*23778Sjerry return(pow); 6010513Sdlw } 61