diff --git a/lib/mathops.c b/lib/mathops.c
index 23c8f6e1bade1cebe6a044ca155154f3fb703ae4..aadaa22a00bfd970124bd5d247bb89df660295dc 100644
--- a/lib/mathops.c
+++ b/lib/mathops.c
@@ -160,7 +160,7 @@ ogg_int64_t oc_bexp64(ogg_int64_t _z){
     /*z is the fractional part of the log in Q62 format.
       We need 1 bit of headroom since the magnitude can get larger than 1
        during the iteration, and a sign bit.*/
-    z<<=5;
+    z*=32;
     /*w is the exponential in Q61 format (since it also needs headroom and can
        get as large as 2.0); we could get another bit if we dropped the sign,
        but we'll recover that bit later anyway.
@@ -175,7 +175,7 @@ ogg_int64_t oc_bexp64(ogg_int64_t _z){
       z-=OC_ATANH_LOG2[i]+mask^mask;
       /*Repeat iteration 4.*/
       if(i>=3)break;
-      z<<=1;
+      z*=2;
     }
     for(;;i++){
       mask=-(z<0);
@@ -183,12 +183,12 @@ ogg_int64_t oc_bexp64(ogg_int64_t _z){
       z-=OC_ATANH_LOG2[i]+mask^mask;
       /*Repeat iteration 13.*/
       if(i>=12)break;
-      z<<=1;
+      z*=2;
     }
     for(;i<32;i++){
       mask=-(z<0);
       w+=(w>>i+1)+mask^mask;
-      z=z-(OC_ATANH_LOG2[i]+mask^mask)<<1;
+      z=(z-(OC_ATANH_LOG2[i]+mask^mask))*2;
     }
     wlo=0;
     /*Skip the remaining iterations unless we really require that much
@@ -207,12 +207,12 @@ ogg_int64_t oc_bexp64(ogg_int64_t _z){
         z-=OC_ATANH_LOG2[31]+mask^mask;
         /*Repeat iteration 40.*/
         if(i>=39)break;
-        z<<=1;
+        z*=2;
       }
       for(;i<61;i++){
         mask=-(z<0);
         wlo+=(w>>i)+mask^mask;
-        z=z-(OC_ATANH_LOG2[31]+mask^mask)<<1;
+        z=(z-(OC_ATANH_LOG2[31]+mask^mask))*2;
       }
     }
     w=(w<<1)+wlo;